你在过程里要用动态sql.......
begin
...
strsql := 'CREATE ROLE ........';
execute immediate strsql;end;
begin
...
strsql := 'CREATE ROLE ........';
execute immediate strsql;end;
解决方案 »
- Oracle开发中局部索引与全局索引有什么作用和区别
- 自己设计的数据库怎样测试性能
- 如何把一个表中的字段赋值给一个自定义表类型的字段
- ORA-03114 not coonected to ORACLE 问题
- 请教一个导入oracle9i数据库的问题。
- oracle培训
- 两个表的结构相同,如何把一个表的数据都insert到另一个表的sql语句如何写?
- select hh,sum(total) from abc group by hh 这条语句没有问题.....
- 求rman 定时备份脚本
- 求指导,如何升级Oracle数据库
- 如何获得一个表中发生改变的数据?
- 在表分区中,按某个varchar2的字段的值和范围如何分呢
strsql := 'CREATE ROLE ........';
execute immediate strsql;
问题产生的原因是直接使用sql语句,可以使用通过role间接授权的权限,比如赋予某个用户dba role之后在sql语句中就能使用所有dba role所拥有的权限,这种授权方式是间接的,被称为隐式授权。而在pl/sql中不能使用通过role所获得的权限,而必须使用grant 某个权限 to user的办法直接给用户授权,这叫做显式授权。
所以你要做的就是执行:
grant create role to myuser;然后就能够执行你的过程了。
我这样理解对吗:
我通过某个角色赋予了一个用户对某个table有SELECT,UPDATE等权限,那么我在应用程序里可以直接使用sql语句来操作这个表,而如果我要使用pl/sql写存储过程来操作这个表就没有权限了,一定要把对这个table的SELECT,UPDATE等权限直接赋给这个用户