PL/SQL 触发器不工作
PL/SQL trigger not working
我创建了一个 table 这样的:
CREATE TABLE table_name (
name VARCHAR2(20)
);
之后,我创建了一个触发器,在每次插入之前,都必须写入用户名:
SET SERVEROUTPUT ON;
CREATE OR REPLACE TRIGGER bi_trigger
BEFORE INSERT ON table_name
FOR EACH ROW
ENABLE
DECLARE
v_user VARCHAR2(20);
BEGIN
SELECT user INTO v_user FROM dual;
DBMS_OUTPUT.PUT_LINE('You inserted a row, ' || v_user);
END;
但是,在我的 table 中插入一些内容后,没有出现带有用户名的请求行。我错过了什么?
INSERT INTO table_name VALUES('qwerty');
您不会看到 dbms_output,因为触发器存在于您的本地会话之外,未连接。如果您只想确认触发器是否正确触发,请尝试向 table 添加一列,例如 created_by VARCHAR2(0032).
用
替换你的扳机主体
:NEW.created_by := USER;
这会告诉您触发器是否正常工作。
我看到两个潜在的问题。
一个是不清楚您是否真的在创建触发器。在您显示的示例代码中,您需要在触发器文本后跟一个正斜杠 (/
) 才能实际执行 CREATE 语句。如果创建成功,您应该会看到 "Trigger created"。
另一个是您在创建触发器之前启用了 SERVEROUTPUT,这是无关紧要的。您需要在执行 INSERT 语句的会话中启用它。 (如果您在与 CREATE 相同的会话中执行 INSERT,则这不是问题。)
(另一个答案暗示您没有看到输出,因为触发器是在您的会话之外执行的。这是不正确的。)
我创建了一个 table 这样的:
CREATE TABLE table_name (
name VARCHAR2(20)
);
之后,我创建了一个触发器,在每次插入之前,都必须写入用户名:
SET SERVEROUTPUT ON;
CREATE OR REPLACE TRIGGER bi_trigger
BEFORE INSERT ON table_name
FOR EACH ROW
ENABLE
DECLARE
v_user VARCHAR2(20);
BEGIN
SELECT user INTO v_user FROM dual;
DBMS_OUTPUT.PUT_LINE('You inserted a row, ' || v_user);
END;
但是,在我的 table 中插入一些内容后,没有出现带有用户名的请求行。我错过了什么?
INSERT INTO table_name VALUES('qwerty');
您不会看到 dbms_output,因为触发器存在于您的本地会话之外,未连接。如果您只想确认触发器是否正确触发,请尝试向 table 添加一列,例如 created_by VARCHAR2(0032).
用
替换你的扳机主体 :NEW.created_by := USER;
这会告诉您触发器是否正常工作。
我看到两个潜在的问题。
一个是不清楚您是否真的在创建触发器。在您显示的示例代码中,您需要在触发器文本后跟一个正斜杠 (/
) 才能实际执行 CREATE 语句。如果创建成功,您应该会看到 "Trigger created"。
另一个是您在创建触发器之前启用了 SERVEROUTPUT,这是无关紧要的。您需要在执行 INSERT 语句的会话中启用它。 (如果您在与 CREATE 相同的会话中执行 INSERT,则这不是问题。)
(另一个答案暗示您没有看到输出,因为触发器是在您的会话之外执行的。这是不正确的。)