动态DDL执行与SchemaObjects显示授权问题
这是一个常见的问题,也很容易被忽略,尤其是在过程中动态执行DDL语句时。我们必须使用显示授权的方法来保证DDL的执行权限,而不能使用角色转移的方法。这里有一个简单的测试过程来验证这一点。
参考描述:
如果被引用的项确实是声明的,并且您认为您有权限引用该项,请检查权限;如果仅通过角色授予权限,则这是预期的行为,并记录在案。存储对象(包、过程、函数、触发器、视图)在对象所有者的安全域中运行,除PUBLIC之外不启用任何角色。同样,您将仅被告知该物品未申报
测试步骤:
SQL >创建由pass标识的用户chris
用户已创建。
SQL >授予Chris DBA;
格兰特成功了。
SQL >连接Chris/pass;
已连接。
SQL >创建表test1(name varchar 2(10));
表已创建。
-这里成功了。
SQL >删除表test1
桌子掉了。
SQL >创建或替换过程chris_cr_tbl
2是
3开始
4立即执行' create table test1(name varchar 2(10))';
5结束;
6 /
过程已创建。
SQL > exec chris _ cr _ tbl
BEGIN chris _ cr _ tbl结束;
*
第1行出错:
ORA-01031:权限不足
ORA-06512:在“克里斯。克里斯_铬_TBL”,第4行
ORA-06512:在第1行
-这里失败了
SQL >连接测试/oracle
已连接。
SQL >授予chris创建表的权限;
格兰特成功了。
-明确授予
SQL >连接克里斯/通过
已连接。
SQL > exec chris _ cr _ tbl
PL/SQL过程已成功完成。
SQL > select table _ name from all _ tables where owner = ' CHRIS ';
表名
-
测试1
SQL >删除表test1
桌子掉了。
位律师回复
0条评论