在触发器中嵌入选择

Posted

技术标签:

【中文标题】在触发器中嵌入选择【英文标题】:Embedding a select within a trigger 【发布时间】:2017-08-02 19:51:14 【问题描述】:

我有大约 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】:

您可以计算匹配的行数:

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;

【讨论】:

以上是关于在触发器中嵌入选择的主要内容,如果未能解决你的问题,请参考以下文章

发送嵌入后删除触发器 |不和谐.js

在图像中嵌入分析代码以在显示图像时触发

我想自动删除嵌入的触发器,我该怎么做?

csharp 将转发器嵌入转换中

如何调用onclick以获得更多href,而不仅仅是触发最后一个-嵌入式javascript模板

媒体触发器结束 (Iframe)