CREATE OR REPLACE PROCEDURE test
AS
sql_stmt VARCHAR2(200);
BEGIN
sql_stmt := 'ALTER TABLE daily_table PARTITIONS p1 , p2 into PARTITION p2';
EXECUTE IMMEDIATE sql_stmt;
END ;
/
上述程序给出了以下错误 -
ORA-01031: insufficient privileges
ORA-06512: at "test", line 8
ORA-06512: at line 6
但是如果我直接在sql提示符下运行ALTER Command,我没有收到任何错误.. 我想知道我需要什么权限才能让用户从程序中执行合并。
答案 0 :(得分:1)
我使用AUTHID CURRENT_USER
解决了这个问题CREATE OR REPLACE PROCEDURE test AUTHID CURRENT_USER
AS
sql_stmt VARCHAR2(200);
BEGIN
sql_stmt := 'ALTER TABLE daily_table PARTITIONS p1 , p2 into PARTITION p2';
EXECUTE IMMEDIATE sql_stmt;
END ;
/
答案 1 :(得分:0)
注意:永远不要在存储过程中使用DDL
。下面是应该避免设计非常非常糟糕的代码的示例。
CREATE OR REPLACE PROCEDURE test
AS
sql_stmt VARCHAR2(200);
BEGIN
sql_stmt := 'GRANT ALTER ON daily_table TO your_user';
EXECUTE IMMEDIATE sql_stmt;
sql_stmt := 'ALTER TABLE daily_table PARTITIONS p1 , p2 into PARTITION p2';
EXECUTE IMMEDIATE sql_stmt;
END ;
/
答案 2 :(得分:0)
我确信如果有人为DDL专门创建了一个存储过程,那么他们就会意识到它是自动提交的。
答案 3 :(得分:0)
我在存储过程中使用DDL:最常见的是截断过程将重新填充的汇总表;不时地为DDLish任务,例如重命名导入表的列以符合Oracle的标识符标准规则,或者为命名表创建主键和序列。一般我用
dbms_utility.exec_ddl_statement(blah);
而不是
EXECUTE IMMEDIATE blah;
偏见我不会试图证明这一点。我要说的是,Oracle提供并记录的打包程序表明不应全面禁止。