在触发器中嵌入选择

时间:2017-08-02 19:51:14

标签: plsql triggers

我有大约20个需要访问生产数据库的只读模式。我不想在DBLink上创建同义词,所以我在网上找到了一个解决方案来创建一个触发器来帮助我。我的所有只读用户都附有类似的配置文件:“profile1”。

以下是有效的触发器示例:

create or replace Trigger logon_trig
After Logon on Database
Begin
  IF USER in ('USER1','USER2') THEN
       execute immediate 'ALTER SESSION SET CURRENT_SCHEMA=PRODDB';
  END IF;
Exception
  When others then
    Null;
End;

问题:

我希望触发器选择具有配置文件“profile1”的所有用户,而不是在触发器语法中对所有用户名进行硬编码。

有什么方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

您可以计算匹配的行数:

CREATE OR REPLACE TRIGGER logon_trig
AFTER LOGON ON DATABASE
DECLARE
    v_count NUMBER;
BEGIN
SELECT USERNAME, PROFILE, ACCOUNT_STATUS FROM DBA_USERS; 

    SELECT COUNT(*)
    INTO   v_count
    FROM   dba_users
    WHERE  username = USER AND profile = 'profile1';

    IF v_count = 0 THEN
       EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA=PRODDB';
    END IF;
EXCEPTION
    WHEN OTHER THEN
        NULL;
END;