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

watbbzwu  于 2023-03-22  发布在  Oracle
关注(0)|答案(1)|浏览(150)

我想将触发器的执行条件设置为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:无效的NEW或OLD规范。因此我输入了一个if:
if (GET_SESSION_USER() = 1) then这行行可以,我必须做一个全局的if吗?我们可以做得更好吗?
谢谢

nx7onnlm

nx7onnlm1#

为什么需要一个函数?在触发器中检查user-不是在它的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>

相关问题