我用A用户建了几个表,然后想把A用户的权限拿掉,其他人用A用户登录进去后,不能修改表的结构,有办法做到吗?我把用户A的所有角色去掉,所有系统权限去掉,只保留了CREATE SESSION和ADMINISTER RESOURCE MANAGER权限(实际上后一个是不知道怎么去掉),限额是不限制。此时A无法建表,但对于以前建的表,还是能ALTER,郁闷死了。难道是因为那几个表是A建的,所有者是它,所以A始终都对它拥有不受限制的特权吗?备注:
1、不能建两个用户的,只能使用用户A。
2、我希望可以通过权限控制,我用的时候就加上这权限,我就可以用A建表,改表,做完后再去掉权限,其他人就没权限改表结构了。谢谢!

解决方案 »

  1.   


    原因如下:我们的系统是用.Net做的,联接字符串为<ConnectString>Data Source=xxx;User ID=xxx;Password=xxx</ConnectString>,我们发现用User ID登录进Oracle时,表名前不加用户名的话,默认的就是访问本用户下的表,而访问不了其他用户的表。因为ConnectString里没有地方指定Schema的名字,所以我们的系统无法支持用其他用户登录访问。-------在SQL SERVER中就不存在这个问题,在ConnectString里可以指定数据库名字,所以你登录到A数据库,完全可以访问B数据库的表。其实,这是我们第一次使用Oracle,对于Oracle中如果让多用户访问同一个Schema的表的方法一直还没搞懂。---我知道可以通过授权让其他用户能访问A用户的表,但问题是,表名前必须要加用户名,这个我们系统暂时不支持。不知道其他系统是如何做到的?
      

  2.   

    那就通过用户B对A用户进行操作,用A用户只能B用户赋权insert update delete.
      

  3.   

    那就通过用户B对A用户进行操作,A用户只对B用户赋权insert update delete.
      

  4.   

    你想剥夺用户对表的ddl权限是做不到的.用户对自己创建的对象有绝对权力.你可以让用户无法登陆,却无法做到登陆后限制用户对自己创建对象的操作.
    一会试试触发器看看,也许能解决
      

  5.   

    SQL> create or replace trigger T_DROP_AVOID
      2    BEFORE DROP OR ALTER  on schema
      3  declare
      4  
      5  BEGIN
      6    if ora_dict_obj_owner = 'SCOTT' AND ora_sysevent ='DROP' then
      7  
      8             Raise_application_error(-20002,'不允许删除对象');
      9  
     10    ELSIF   ora_dict_obj_owner = 'SCOTT' AND ora_sysevent ='ALTER' then
     11  
     12             Raise_application_error(-20002,'不允许修改对象结构');
     13  
     14    end if ;
     15  
     16  
     17  END ;
     18  /
     
    Trigger created
     
    SQL> drop table emp;
     
    drop table emp
     
    ORA-00604: error occurred at recursive SQL level 1
    ORA-20002: 不允许删除对象
    ORA-06512: at line 6
     
    SQL> alter table emp add (c number(2));
     
    alter table emp add (c number(2))
     
    ORA-00604: error occurred at recursive SQL level 1
    ORA-20002: 不允许修改对象结构
    ORA-06512: at line 10
     
    SQL> alter trigger t_drop_avoid disable;
     
    Trigger alteredSQL> drop table empp;
     
    Table dropped
     
    SQL> 
      

  6.   

    ConnectString里没有地方指定Schema的名字
    但是oracle里可以更改user的默认Schema吧?
      

  7.   

    修改A用户权限就可以了啊。让A用户只有查询的权限没有其他的权限。grant select on A to username
      

  8.   

    revoke    加grant结合
      

  9.   

    1、用系统触发器(on database),sys或system建立,就可以防止被删,如7楼的
    2、新建一个B用户,对所要操作对象建立同名词,只授予DML权限
      

  10.   

    视图也是一种方法。挺好的。不过revoke 与 grant 就能完成你的工作了。
      

  11.   


    请教一下如何使用revoke来取消该用户对自己所拥有表的DDL权限?要一个表一个表的运行revoke alter on tablename from 用户命令吗?我试过会提示:ora-01927 不能revoke 没有授予的权限。因为当时给用户赋予的是CREATE TABLE的权限,但我现在要拿到Alter table 的权限,会提示我不能拿掉没有授予的权限。但压根没有人授予它ALTER TABLE的权限,只是因为是它CREATE的表,它是所有者,所以它隐含的默认拥有对该表的所有权限。我是个新学者,求各位高手不吝指教。
      

  12.   

    这个不错
    on database吧我一般都是给予INSERT/UPDATE/DELETE+创建同名的方法,CREATE SYNONYM a.VOD_EPG_FOLDER FOR b.VOD_EPG_FOLDER ;
    GRANT SELECT ON b.VOD_EPG_FOLDER TO a;这样就让别人用A,实际SCHEMA在B,不授权ALTER,就不会修改结构
    再给A一个create session
    revoke CREATE TABLE他最多能删除SYNONYM,不过也能引起故障哦,恢复比较快的