假設有一個procedure,實作動態產生TEMPORARY TABLE的程式碼,compiler都ok 但是一執行就會有錯誤訊息。

 

ORA-01031: insufficient privileges

 

CREATE OR REPLACE PROCEDURE TEST2
IS
 sql_stmt VARCHAR2 (4000);
BEGIN
 sql_stmt :=
 'CREATE GLOBAL TEMPORARY TABLE '
 ' t10'
 ' ON COMMIT PRESERVE ROWS AS (SELECT * FROM '
 ' t9'
 ' WHERE 1=2) ';
 EXECUTE IMMEDIATE sql_stmt;
EXCEPTION
 WHEN OTHERS
 THEN
 DBMS_OUTPUT.put_line (SQLERRM);
END;

 

怎麼會權限不足?

這個user已經給了dba權限啊? 且在SQLPLUS 直接執行 相同的CREATE GLOBAL TEMPORARY TABLE ...SQL 是可以正常執行的,表示權限OK

 

有個觀念要先知道:

1.TEMPORARY TABLE 是產生在預設的TEMPORARY TABLESPACE 內
而非使用者的TABLESPACE SCHEMA內。

2.PROCEDURE內執行CREATE 非自己 SCHEMA 的Table,
除非有 CREATE ANY TABLE TO <SCHEMA>...
否則權限會不足,(原因會再去了解再補上),
有另一種方法很省事是在 CREATE PROCEDURE
加上關鍵字 AUTHID CURRENT_USER 即可。

 

CREATE OR REPLACE PROCEDURE TEST2
 AUTHID CURRENT_USER
IS
 sql_stmt VARCHAR2 (4000);
BEGIN
 sql_stmt :=
 'CREATE GLOBAL TEMPORARY TABLE '
 ' t10'
 ' ON COMMIT PRESERVE ROWS AS (SELECT * FROM '
 ' t9'
 ' WHERE 1=2) ';

 EXECUTE IMMEDIATE sql_stmt;
EXCEPTION
 WHEN OTHERS
 THEN
 DBMS_OUTPUT.put_line (SQLERRM);
END;
文章標籤
全站熱搜
創作者介紹
創作者 味味A 的頭像
味味A

味味A

味味A 發表在 痞客邦 留言(0) 人氣(0)