1. 執行DDL報錯
在oracle存儲過程中,默認是可以直接執行DML和DQL的,但是執行CREATE這種的DDL則需要借助EXECUTE IMMEDIATE ···了,如下備份表語句
--抄表表備份 SELECT TO_CHAR(SYSDATE,'YYMMDD') INTO V_DQRQ FROM DUAL; V_CREATESQL := 'CREATE TABLE SF_EBZCB'||V_DQRQ||'_T AS SELECT * FROM SF_EBZCB_T'; EXECUTE IMMEDIATE V_CREATESQL;
當執行該語句時,提示 ORA-01031: 權限不足。該用戶已賦予DBA權限。
原因:CREATE TABLE想使用CREATE ANY TABLE權限,而CREATE ANY TABLE權限來自DBA角色,默認情況下,雖然在會話環境中可見,但在存儲過程中不可見(無效)。
即:ORACLE默認為定義者權限,定義者權限在存儲過程中ROLE無效,需要顯式授權。
GRANT CREATE ANY TABLE TO charge_liny;
執行上面sql顯式授權后,在該用戶下通過 EXECUTE IMMEDIATE 執行CREATE語句即可成功創建表。
2. 授權當前用戶查詢其他用戶下的表
查詢另一用戶下的中間庫某表中的數據並更新到當前用戶中的某個表中,當調用其他用戶的表時,需要使用 用戶.表名 的格式來區分該表是否是當前用戶下的表,這里也需要在被調用的用戶下顯式的授權給當前用戶查詢權限。
INSERT INTO SF_EBZCB_T (YHBH, CNQ, JLBBH, SCBS, BCBS, YL, JSYL) SELECT YHBH, CNQ, RBXH, QCBL, JZBL, BJYL, SJYL FROM USER_INFO.RB_INFO
WHERE SYNCSTATE = 0 AND CNQ = SF_DQCNQ_F;
授權語句(在USER_INFO用戶下)
GRANT SELECT ANY TABLE TO CHARGE_LINY;
授權其他DML權限
GRANT INSERT ANY TABLE TO CHARGE_LINY; GRANT UPDATE ANY TABLE TO CHARGE_LINY; GRANT DELETE ANY TABLE TO CHARGE_LINY;
