有条件地执行触发器用户 Oracle

问题描述 投票:0回答:1

我想将触发器的执行条件设置为 oracle 用户。
如果是 Oracle 用户 : X,则不执行触发器,否则是。

我创建了一个函数

CREATE OR REPLACE FUNCTION GET_SESSION_USER 
RETURN NUMBER
IS
    user_name_current VARCHAR2(50);
    resultat NUMBER := 1;
BEGIN
user_name_current := USER;
IF user_name_current = 'X' THEN
 resultat := 0;
end if;
RETURN resultat;
END;

在触发器中调用函数

CREATE OR REPLACE TRIGGER "TEST"."table1_trigger"
BEFORE UPDATE ON table1
FOR EACH ROW
-- WHEN (GET_SESSION_USER() = 1)
DECLARE
   ...
BEGIN
IF (GET_SESSION_USER() = 1) THEN
   ...
END IF;

-- WHEN (GET_SESSION_USER() = 1)
返回错误:ORA-04076:无效的新规范或旧规范。所以我放了一个如果:
if (GET_SESSION_USER() = 1) then
这条线有效,我必须做一个全局 if 吗?我们能做得更好吗?

谢谢

oracle function plsql triggers oracle12c
1个回答
0
投票

为什么需要函数?在触发器中检查用户 - 不是在它的

when
子句中,而是
if-then-else
.

为什么不能将

when
子句与函数调用一起使用?因为 create trigger 文档说:

  • 这个条件必须包含相关名称,不能包含查询
  • 您不能在触发条件中调用 PL/SQL 函数或方法

SQL> CREATE TABLE table1
  2  (
  3     name   VARCHAR2 (20)
  4  );

Table created.

SQL> CREATE OR REPLACE TRIGGER table1_trigger
  2     BEFORE INSERT OR UPDATE
  3     ON table1
  4  BEGIN
  5     IF USER = 'SCOTT'
  6     THEN
  7        DBMS_OUTPUT.put_line ('Hello, ' || USER);
  8     ELSE
  9        DBMS_OUTPUT.put_line ('You aren''t Scott');
 10     END IF;
 11  END;
 12  /

Trigger created.

测试:

SQL> SHOW USER
USER is "SCOTT"
SQL> INSERT INTO table1 (name) VALUES ('Littlefoot');
Hello, SCOTT

1 row created.

SQL>

在 40 个触发器中对 SCOTT 进行硬编码是一项乏味的工作,而且 - 可能 - 无用(如果你决定将该代码移动到另一个模式并且 SCOTT 变成 PETER 或其他东西)。在这种情况下,您可以创建函数并使用它 - 但不是在触发器的

when
子句中 - 但在
if-then-else
:

SQL> CREATE OR REPLACE FUNCTION get_session_user
  2    RETURN NUMBER
  3  IS
  4  BEGIN
  5    RETURN CASE WHEN USER = 'SCOTT' THEN 1
  6                ELSE 0
  7           END;
  8  END;
  9  /

Function created.

SQL> CREATE OR REPLACE TRIGGER table1_trigger
  2     BEFORE INSERT OR UPDATE
  3     ON table1
  4  BEGIN
  5     IF get_session_user = 1                       --> here
  6     THEN
  7        DBMS_OUTPUT.put_line ('Hello, ' || USER);
  8     ELSE
  9        DBMS_OUTPUT.put_line ('You aren''t Scott');
 10     END IF;
 11  END;
 12  /

Trigger created.

SQL> INSERT INTO table1 VALUES ('x');
Hello, SCOTT

1 row created.

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.