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,则这不是问题。)

(另一个答案暗示您没有看到输出,因为触发器是在您的会话之外执行的。这是不正确的。)