PL / SQL触发器无法正常工作

时间:2017-11-26 15:28:33

标签: oracle plsql database-trigger

我创建了一个这样的表:

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;

但是,在我的表格中插入内容后,所显示的用户姓名行无法显示。我错过了什么?

INSERT INTO table_name VALUES('qwerty');

2 个答案:

答案 0 :(得分:1)

您无法看到dbms_output,因为触发器存在于本地会话之外,未连接。如果您只想确认触发器正在正确触发,请尝试向表中添加一列,例如created_by VARCHAR2(0032)。

替换触发器主体
    :NEW.created_by := USER;

这将告诉您触发器是否正常工作。

答案 1 :(得分:1)

我发现了两个潜在的问题。

其中一个原因是,您是否真正创建了触发器并不清楚。在您显示的示例代码中,您需要在触发器文本后面使用正斜杠(/)来实际执行CREATE语句。您应该看到" Trigger created"如果成功创建。

另一个是你在创建触发器之前启用SERVEROUTPUT,这是无关紧要的。您需要在执行INSERT语句的会话中启用它。 (如果您在与CREATE相同的会话中执行INSERT,则不是问题。)

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