我用DBA建立了一个用户scott,赋给他表空间A里查询所有表的权限,因为A里面有上百张表,所以我用 grant select any table 给scott赋的权限,但是我现在想收回scott对A其中一张表pay的select权限,用revoke select on pay 这条语句,但是报错,提示是没有grant,所以不能revoke,这是为什么?是不是用了any table的缘故,如果是的话,我应该如何收回?
scott下有emp表,现在想这个表只有scott才能查看到数据。用scott登录执行:create or replace function rls_test(p_schema in varchar2, p_object in varchar2) return varchar2 as begin if (user = 'SCOTT') then return ''; else return '1=0'; end if; end;exec dbms_rls.add_policy(object_name=>'EMP',policy_name=>'TESTRLS',policy_function=>'RLS_TEST',statement_types=>'select,insert,update,delete');
以select权限为例。 比如你用户A,B,C都有select on any table的权限,现在想让C看不到emp这张表中的数据。那么:create or replace function rls_test(p_schema in varchar2, p_object in varchar2) return varchar2 as begin if (user = 'C') then return '1=2'; end if; return ''; end; exec dbms_rls.add_policy(object_name=>'EMP',policy_name=>'TESTRLS',policy_function=>'RLS_TEST',statement_types=>'select,insert,update,delete'); 这样执行之后,A,B还可以看到emp表及表中的数据。C就只能看emp表的结构,无法看到emp表中的数据了. 至于update权限,请看:statement_types=>'select,insert,update,delete'。具体的你再google了btw:没有grant,revoke这样的东东来实现你说的东西了.
13楼: 我懂你的意思了,谢了 另外,你有没有一次性赋给用户多个表的权限的方法,前提是不使用select on any table,是不是必须 grant select on pay1,pay2,pay3.... to scott;象这样一一列举表名吗?
你这个要自已来实现sql了select 'grant select on ' || table_name || ' to scott;' from dba_tables;这样spool到一个文本中就可以了
我用的语句如下:
grant select any table to scott;
赋权成功
我试了,没问题
收回语句:
revoke select on pay from scott;
报错:cannot REVOKE privileges you did not grant
为什么?
如何实现grant select on 除pay表之外的表 to scott?
不能互相操作的。revoke 掉一个对象的权限,select any table 权限就不完整了。
那我如何给一个用户赋给他上百张表的权限?难道一张张的赋呀?
我想达到的目的是附给一个用户除pay以外所有表的select的权限/
begin
if (user = 'SCOTT') then
return '';
else
return '1=0';
end if;
end;exec dbms_rls.add_policy(object_name=>'EMP',policy_name=>'TESTRLS',policy_function=>'RLS_TEST',statement_types=>'select,insert,update,delete');
有没有从授权上来限制pay表的方法呀,你说的方法感觉不是很灵活吧,我有很多用户,只想限制其中一个用户访问pay表,其他的用户还可以继续访问。而且,如果我限制的不是select权限,而是update呢?
比如你用户A,B,C都有select on any table的权限,现在想让C看不到emp这张表中的数据。那么:create or replace function rls_test(p_schema in varchar2, p_object in varchar2) return varchar2 as
begin
if (user = 'C') then
return '1=2';
end if;
return '';
end; exec dbms_rls.add_policy(object_name=>'EMP',policy_name=>'TESTRLS',policy_function=>'RLS_TEST',statement_types=>'select,insert,update,delete'); 这样执行之后,A,B还可以看到emp表及表中的数据。C就只能看emp表的结构,无法看到emp表中的数据了.
至于update权限,请看:statement_types=>'select,insert,update,delete'。具体的你再google了btw:没有grant,revoke这样的东东来实现你说的东西了.
我懂你的意思了,谢了
另外,你有没有一次性赋给用户多个表的权限的方法,前提是不使用select on any table,是不是必须
grant select on pay1,pay2,pay3.... to scott;象这样一一列举表名吗?
from dba_tables;这样spool到一个文本中就可以了
select any table 是一个具体的权限.
必须显式地执行 grant xxx on yyy to user,才可以用revoke xxx on yyy from user.