如何设置 Oracle 用户的默认架构?

14 oracle sqlplus

我在 Oracle 中创建了一些新用户。但是,在运行sqlplus时,它们都需要完全限定查询中的表名。为这些新用户设置默认架构的最佳方法是什么?

a_h*_*ame 21

set search_pathOracle 中没有像 PostgreSQL 那样的东西。

我能想到的最接近的事情是运行的用户的登录触发器 ALTER SESSION SET CURRENT_SCHEMA ...

CREATE OR REPLACE TRIGGER LOGON_TRG 
  AFTER LOGON ON SCHEMA
BEGIN
     EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
EXCEPTION 
  when others 
    then null; -- prevent a login failure due to an exception
END;
/  
Run Code Online (Sandbox Code Playgroud)

如果用户列表不太长,您可以创建一个数据库登录触发器,这样您就不必为每个用户创建该触发器:

CREATE OR REPLACE TRIGGER LOGON_TRG 
  AFTER LOGON ON DATABASE
BEGIN
    if (user in ('TOM', 'DICK', 'HARRY')) then
      EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
    end if;
exception 
  when others 
    then null; -- prevent a login failure due to an exception
END logon_trg;
/  
Run Code Online (Sandbox Code Playgroud)

当然,您想要更改默认架构的用户列表也可以从表中获取。在这种情况下,您只需从那里插入或删除行即可“激活”此功能(而不是每次都重新创建触发器)。

另一种选择是在每次创建指向真实表的用户时创建同义词。您可以使用循环遍历一个模式中的所有表并在另一个模式中为它们创建同义词的存储过程自动执行此操作。

除非您的所有Oracle 用户都在同一个表上工作,否则我强烈建议不要使用您只需要创建一次的公共同义词 - 如果您的安装中存在不同的应用程序用户,它们会导致很多麻烦。

编辑

按照 Alex 的建议,这里有一个登录触发器,用于检查角色而不是用户名:

CREATE OR REPLACE TRIGGER LOGON_TRG
  AFTER LOGON ON DATABASE
declare
  has_role boolean;
BEGIN

    has_role := dbms_session.is_role_enabled('FOOBAR_ROLE');

    if (has_role) then
      EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
    end if;
exception 
   when others 
      then null; -- prevent a login failure due to an exception    
END logon_trg;
/
Run Code Online (Sandbox Code Playgroud)


clj*_*ljk -1

我不认为有一种方法可以设置。用户就是模式。AFAIK 你只能设置默认表空间。