在很多场景下,运维人员为了方便, 通常在Oracle数据库中使用dba角色给其他用户授权, dba角色的用户,拥有很大的能力,可能任意访问其他数据,那么在存储过程中也是这样吗?我们一探究竟
#### 1.测试过程
创建两个用户,并赋予dba角色,查看相关数据
``` sql
SQL> conn mywork/oracle
Connected.
SQL> select *from mytest.t1;
P1 F1 F2
---------- ---------- ----------
1 2
2 1 2
3 1 2
--执行 删除操作
SQL> delete from mytest.t1;
3 rows deleted.
SQL>
```
创建存储过程,测试是否可以执行
``` sql
SQL> create or replace procedure work_test_t1
as
begin
delete from mytest.t1;
commit;
end;
/ 2 3 4 5 6 7
Warning: Procedure created with compilation errors.
SQL> show error
Errors for PROCEDURE WORK_TEST_T1:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/1 PL/SQL: SQL Statement ignored
4/20 PL/SQL: ORA-00942: table or view does not exist
SQL>
```
显示赋权,并再次执行, 执行成功。
``` sql
SQL> conn mytest/oracle
Connected.
SQL> grant all on t1 to mywork;
Grant succeeded.
SQL> conn mywork/oracle
Connected.
SQL> create or replace procedure work_test_t1
as
begin
delete from mytest.t1;
commit;
end;
/ 2 3 4 5 6 7
Procedure created.
SQL>
```
有上述测试得知,role在定义者权限存储过程不可见。
#### 2.总结
在编写PLSQL程序时,Oracle PL/SQL提供两种授权模式
- AUTHID DEFINER (定义者权限):指编译存储对象的所有者。也是默认权限模式。(在执行中,当前用户只有除角色权限外的权限)
- AUTHID CURRENT_USER(调用者权限):指拥有当前会话权限的模式,这可能和当前登录用户相同或不同。(在执行中,当前用户拥有已经授以的所有权限(包含角色权限和系统权限)。
#### 3.参考
- 《剑破冰山-Oracle开发艺术》
- http://blog.itpub.net/15489979/viewspace-742760/
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




