我在 Oracle 中创建了一些新用户。但是,在运行sqlplus时,它们都需要完全限定查询中的表名。为这些新用户设置默认架构的最佳方法是什么?
a_h*_*ame 21
set search_path
Oracle 中没有像 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)
归档时间: |
|
查看次数: |
60583 次 |
最近记录: |