我想将触发器的执行条件设置为 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 吗?我们能做得更好吗?
谢谢
为什么需要函数?在触发器中检查用户 - 不是在它的
when
子句中,而是 if-then-else
.
为什么不能将
when
子句与函数调用一起使用?因为 create trigger 文档说:
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>