我用DBA建立了一个用户scott,赋给他表空间A里查询所有表的权限,因为A里面有上百张表,所以我用 grant select any table 给scott赋的权限,但是我现在想收回scott对A其中一张表pay的select权限,用revoke select on pay 这条语句,但是报错,提示是没有grant,所以不能revoke,这是为什么?是不是用了any table的缘故,如果是的话,我应该如何收回?

解决方案 »

  1.   

    revoke的用法:REVOKE SELECT ON 表名 FROM 用户名;
      

  2.   

    REVOKE的时候没有指定用户吧? 
      

  3.   

    我知道revoke的语法,不是语法的问题,我感觉是因为用了grant select any table 的缘故
      

  4.   

    换句话说吧,我附给用户scott对表空间A的select any table 的权限,但当我想收回其中一张表的权限时,用revoke收不回来,为什么?
      

  5.   

    我是楼主:
    我用的语句如下:
    grant select any table to scott;
    赋权成功
    我试了,没问题
    收回语句:
    revoke select on pay from scott;
    报错:cannot REVOKE privileges you did not grant
    为什么?
      

  6.   

    得调整策略.revoke select any table from scott;grant select on 除pay表之外的表 to scott;
      

  7.   

    我是楼主: 
    如何实现grant select on 除pay表之外的表 to scott?
      

  8.   

    一个系统权限,一个对象权限
    不能互相操作的。revoke 掉一个对象的权限,select any table 权限就不完整了。
      

  9.   

    我是楼主:
    那我如何给一个用户赋给他上百张表的权限?难道一张张的赋呀?
    我想达到的目的是附给一个用户除pay以外所有表的select的权限/
      

  10.   

    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');
      

  11.   

    以上,其它用户具有任何权限都无法查看scott.emp表中的数据,但是可以查看此表的表结构
      

  12.   

    10楼的大哥:
    有没有从授权上来限制pay表的方法呀,你说的方法感觉不是很灵活吧,我有很多用户,只想限制其中一个用户访问pay表,其他的用户还可以继续访问。而且,如果我限制的不是select权限,而是update呢?
      

  13.   

    以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这样的东东来实现你说的东西了. 
      

  14.   

    13楼:
    我懂你的意思了,谢了
    另外,你有没有一次性赋给用户多个表的权限的方法,前提是不使用select on any table,是不是必须
    grant select on pay1,pay2,pay3.... to scott;象这样一一列举表名吗?
      

  15.   

    你这个要自已来实现sql了select 'grant select on ' || table_name || ' to scott;'
      from dba_tables;这样spool到一个文本中就可以了
      

  16.   

    15楼,我按照你说的做,如果将来我又想让scott能使用pay表了,又如何做呢?是不是停掉那个rls_test函数?
      

  17.   

    对oracle权限结果不清导致.
    select any table 是一个具体的权限. 
    必须显式地执行  grant xxx  on yyy to user,才可以用revoke xxx on yyy  from user. 
      

  18.   

    那使用了select any table 的话,如何收回其中一张表的权限?