存储过程权限与DBlink调用_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2486 | 回复: 0   主题: 存储过程权限与DBlink调用        下一篇 
    本主题由 Administrator 于 2014-11-19 9:35:00 移动
Xuziwen
注册用户
等级:上尉
经验:721
发帖:66
精华:0
注册:2012-7-4
状态:离线
发送短消息息给Xuziwen 加好友    发送短消息息给Xuziwen 发消息
发表于: IP:您无权察看 2012-8-2 9:05:32 | [全部帖] [楼主帖] 楼主

一.定义都权限存储过程role无效,必须要显示授权

--建用户并都赋与DBA权限
create user yx identified by yx
create user jb identified by jb
grant dba to jb
grant dba to yx
--yx创建表
create table yx_tab
as
select * from dba_objects
where rownum<200
--jb用户sql语句可以正常
select * from yx.yx_tab;
--jb创建存储过程,编译时出错,提示表或视图不存在
CREATE OR REPLACE procedure test
as
begin
delete from yx.yx_tab;
commit;
end;
/
--登录yx用户,显示授权yx_tab表所有权限给jb.再重新编译test存储过程,成功了
grant all on yx_tab to jb
revoke all on yx_tab from jb


二.调用者权限存储过程Role编译不可见,运行可见

CREATE OR REPLACE procedure test(sq varchar2)
AUTHID CURRENT_USER
as
begin
delete from yx.yx_tab;
commit;
end;
/


以上编译时提示表或视图不存在

利用动态SQL避免直接授权,而将权限检查到运行时,以下测试成功

CREATE OR REPLACE procedure test(sq varchar2)
AUTHID CURRENT_USER
as
begin
EXECUTE Immediate 'delete from yx.yx_tab';
commit;
end;
/


三.存储过程中执行DDL操作
存储过程中不能直接执行DDL操作,编译会出错,只能会动态SQL

--登录jb,建立存储过程
CREATE OR REPLACE procedure test(sq varchar2)
as
begin
DBMS_OUTPUT.PUT_LINE (
sq);
EXECUTE Immediate sq;
end;
/
--运行成功
exec test('create table test4(id number)');
--登录yx,执行test后表创建在了用户jb下,而不是yx下
exec jb.test('create table test1(id number)');
--此时需要把test过程改为调用者权限,便可以在当前调用存储过程的用户下创建表
CREATE OR REPLACE procedure test(sq varchar2)
AUTHID CURRENT_USER
as
begin
DBMS_OUTPUT.PUT_LINE (
sq);
EXECUTE Immediate sq;
end;
/


四,通过DBLink调用存储过程

--运行出错,不能通过dblink执行DDL 语句
exec
jb.test@dblink('createtable test1(id number)');
--运行正确,成功删除jb.test1表数据
exec
jb.test@dblink('deletetable jb.test1');
--改写procedure test,加上commit语句
CREATE OR REPLACE procedure test(sq varchar2)
AUTHID CURRENT_USER
as
begin
DBMS_OUTPUT.PUT_LINE (
sq);
EXECUTE Immediate sq;
commit;
end;
/
--执行出错,通过dblink调用的存储过程中不能有commit;
exec
jb.test@dblink('deletetable jb.test1');


该贴由system转至本版2014-11-19 9:35:00



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论