為了在生產環境中將SZSJTJFX模式下的所有對象的只讀權限授予XXXX的賬號SZJG_CPZLJD,可以通過以下分批處理的腳本來完成。此腳本會遍歷SZSJTJFX模式下的所有表和視圖,并生成相應的GRANT語句,以避免“過多的對象名前綴”錯誤。
分批處理的動態SQL腳本
DECLARECURSOR CUR IS SELECT OBJECT_NAME FROM ALL_OBJECTS WHERE OWNER = 'SZSJTJFX' AND OBJECT_TYPE IN ('TABLE', 'VIEW');SQLSTMT VARCHAR2(1000);BATCH_SIZE CONSTANT PLS_INTEGER := 10; -- 設置為更小的批次OBJECT_COUNT PLS_INTEGER := 0;
BEGINFOR REC IN CUR LOOPBEGINSQLSTMT := 'GRANT SELECT ON SZSJTJFX.' || REC.OBJECT_NAME || ' TO SZJG_CPZLJD;';EXECUTE IMMEDIATE SQLSTMT;EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('Error granting SELECT on ' || REC.OBJECT_NAME || ': ' || SQLERRM);END;OBJECT_COUNT := OBJECT_COUNT + 1;IF OBJECT_COUNT >= BATCH_SIZE THENCOMMIT;OBJECT_COUNT := 0;END IF;END LOOP;COMMIT;
END;
解釋
- DECLARE: 聲明所需變量和常量。
CUR
: 游標查詢獲取SZSJTJFX模式下所有表和視圖的名稱。SQLSTMT
: 存儲動態生成的GRANT語句。BATCH_SIZE
: 設置為更小的批次大小(如10)。OBJECT_COUNT
: 記錄當前批次中已處理的對象數量。
- FOR REC IN CUR LOOP: 循環遍歷游標中的每一行。
- BEGIN … END: 包裝GRANT語句的執行,以便捕捉異常。
- SQLSTMT := ‘GRANT SELECT ON SZSJTJFX.’ || REC.OBJECT_NAME || ’ TO SZJG_CPZLJD;';: 拼接生成GRANT語句。
- EXECUTE IMMEDIATE SQLSTMT;: 執行生成的GRANT語句。
- EXCEPTION: 捕捉異常并輸出錯誤信息。
- OBJECT_COUNT := OBJECT_COUNT + 1;: 增加當前批次的對象計數。
- IF OBJECT_COUNT >= BATCH_SIZE THEN: 檢查是否達到批次大小。
- COMMIT;: 提交當前批次的事務。
- OBJECT_COUNT := 0;: 重置對象計數。
- END LOOP: 循環結束。
- COMMIT;: 提交最后一批未滿批次大小的事務。
- END: 匿名PL/SQL塊結束。
執行步驟
- 使用數據庫管理工具(如達夢數據庫管理工具)登錄到生產環境數據庫。
- 確保啟用了
DBMS_OUTPUT
,以便可以看到調試信息。 - 打開SQL窗口并粘貼上述腳本。
- 執行腳本,完成權限授予。
驗證權限
可以使用以下查詢驗證是否正確授予了只讀權限:
SELECT * FROM SZSJTJFX.某個表名 WHERE ROWNUM = 1;
使用SZJG_CPZLJD
賬號執行該查詢,確保能成功返回結果,以驗證權限是否正確授予。