Plsql 在触发器中嵌入select

Plsql 在触发器中嵌入select,plsql,triggers,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 SES

我有大约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”的所有用户,而不是在触发器语法中硬编码所有用户名


有什么方法可以做到这一点吗?

您可以计算匹配行的数量:

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;