回收权限
SQL>revoke drop any table from user

解决方案 »

  1.   

    grant Select,Insert,Update,Delete on tab to 用户;
      

  2.   

    TO:zhaokeke2004(男人·海洋) 
    回收权限
    SQL>revoke drop any table from user
    ORA-01952: system privileges not granted to 'testuser1'
      

  3.   

    TO:waxle(清风居士) 
     
    -->另外要看看授予了什么角色,然后收回删除任何表的权限就可以了。
      
    什么角色也没有授予。
    只给了一个CREATE SESSION的连接系统权限。
      

  4.   

    TO:binkou(查有此人) 
     
    -->grant Select,Insert,Update,Delete on tab to 用户;
      
     
    试过了,没有出错,但是该用户还是可以Drop Table.
      

  5.   

    的确,同义词就可以解决这个问题了!建两个用户testuser1,testuser2
    对象全在testuser1下面建,
    用户使用testuser2访问,并建好testuser1下面对象的同义词.
    然后使用testuser1用户给testuser2赋Select,Insert,Update,Delete权限
      

  6.   

    SQL> create or replace trigger trg_dropdeny
      2     before drop on database
      3   begin
      4     if lower(ora_dict_obj_name())='test'
      5      then
      6       raise_application_error(
      7       num=>-20000,
      8       msg=>'你疯了,想删除表'||ora_dict_obj_name()||'?!!!'||'你完了,警察来抓
    你了...');
      9   end if;
     10  end;
     11  /触发器已创建SQL> create table test(a number);表已创建。SQL> drop table test;
    drop table test
    *
    ERROR 位于第 1 行:
    ORA-00604: 递归 SQL 层 1 出现错误
    ORA-20000: 你疯了,想删除表TEST?!!!你完了,警察来抓你了...
    ORA-06512: 在line 4
      

  7.   

    去掉IF..THEN后就是对整个数据库进行监控,以SYS用户登陆
      

  8.   

    TO:luxuezhu(卢冲) 
    请问如果DBA需要维护的时候,要删除表怎么办?
    把trigger 再去掉?
      

  9.   

    TO:sunnylkyou() 
    不好意思,请问“用户使用testuser2访问,并建好testuser1下面对象的同义词”
    这句话怎么操作?
    本人是客串DB管理,头大!
      

  10.   

    举个例子:
    使用testuser1登陆
    grant select on table1 to testuser2;
    使用testuser2登陆
    create synonym table1 for testuser1.table1;
    使用testuser1登陆
    赋给testuser2其他的权限
    这样,用testuser2登陆,直接操作表名table1(实际上是testuser1.table1的同名) ,就像是操作自己的表一样.同时testuser2对于这张表,没有drop的权限
      

  11.   

    TO:sunnylkyou() 
    我明白你的意思了,可是目前的情况是也不允许testuser2有synonym 权限,该怎么办?
    TO:luxuezhu(卢冲) 
    你的方法很好,可是能不能让DBA还是能够Drop Table ?
    比如:
    SQL> create or replace trigger trg_dropdeny
      2     before drop on database
      3   begin
      4     if lower(ora_dict_obj_name())='test' and getConnectUserName()='testuser1'
      5      then
      6       raise_application_error(
      7       num=>-20000,
      8       msg=>'你疯了,想删除表'||ora_dict_obj_name()||'?!!!'||'你完了,警察来抓
    你了...');
      9   end if;
     10  end;
     11  /
    里面的getConnectUserName是我自己加的。我不太清楚Oracle里是否有方法得到当前连接的用户是什么名字。
      

  12.   

    我改了一下,哪位大哥帮忙看看,哪里错了?不是太懂PL/SQL。CREATE OR REPLACE TRIGGER trg_dropdeny 
    before drop on database  
    begin
     v_username VARCHAR2(100);
     select username into v_username from user_users;     if (lower(ora_dict_obj_name())='t1') and (v_username='tetra0')
          then
           raise_application_error(
           num=>-20000,
           msg=>'You can not delete table ' || ora_dict_obj_name() || ' ! ');
       end if;
    end;
    /
      

  13.   

    CREATE OR REPLACE TRIGGER trg_dropdeny
     before drop on database
     begin
          if (sys.login_user!='SYS')
           then
            raise_application_error(
            num=>-20000,
            msg=>'You can not delete table ' || ora_dict_obj_name() || ' ! ');
        end if;
     end;