对于guest权限的控制,可以对每个表显示授权就可以了,例如:GRANT INSERT ON "Admin"."table1" TO "guest";
GRANT SELECT ON "Admin"."table1" TO "guest";
GRANT UPDATE ON "Admin"."table1" TO "guest";
GRANT DELETE ON "Admin"."table1" TO "guest";至于不用加Admin后缀 有两种办法:
1.为每个表创建同义词,例如:
create public synonym table1  for admin.table1;
这个是全局的,谁登录了都可以用
create synonym guest.table1 for admin.table1;
这个只限制guest用户使用
2.创建触发器,在guest用户登录时触发,执行一下语句:
DBMS_SESSION.SET_CONTEXT ('USERENV','CURRENT_SCHEMA','ADMIN');

解决方案 »

  1.   

    to: doulikeme(来去无踪) 谢谢你提出的方法,我现在还没有测试,感觉应该可以达到要求,但是总觉的有点太烦琐,不知还有没有更好点的方法
      

  2.   

    GRANT INSERT ON "Admin"."table1" TO "guest";
    GRANT SELECT ON "Admin"."table1" TO "guest";
    GRANT UPDATE ON "Admin"."table1" TO "guest";
    GRANT DELETE ON "Admin"."table1" TO "guest";这些语句都是可以通过SQL生成的,没什么麻烦的
      

  3.   

    to:doulikeme(来去无踪),
    那些命令用连接符 || 是可以生成,这个我知道,但是如果以后想添加一个新的表,是不是也要再分配一次权限,同时同义词是不是也要再重新建一次,另外这个数据库里还有很多触发器,很多序列(这两个主要是用于字段自动增1用的),那些序列触发器是不是也要建一些同义词,再分配一次权限才可以访问?
      

  4.   

    权限是要在建表或者其他对象时授予的,因为你要限制guest用户仅能访问admin的对象,那就只好设置对象权限了如果你觉得同义词麻烦,就建个触发器,在登录的时候把用户的当前方案改成admin就可以了仅供参考
      

  5.   

    to:doulikeme(来去无踪),真的要谢谢你了,看来只好用第二种方法了,不过我现在还不知道第二种方法具体该怎么写,你能帮我写出具体代码吗?
    我想试一下这种方法,谢谢
      

  6.   

    有点记错了,dbms_session那个不能用的,查了一下用 alter session就可以了CREATE OR REPLACE TRIGGER logon_trigger
    AFTER LOGON ON DATABASE
    BEGIN
         IF UPPER(sys.login_user) = UPPER('guest') THEN
             EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA=ADMIN';
         END IF;
    END;