我创建了一个这样的表:
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');
答案 0 :(得分:1)
您无法看到dbms_output,因为触发器存在于本地会话之外,未连接。如果您只想确认触发器正在正确触发,请尝试向表中添加一列,例如created_by VARCHAR2(0032)。
用
替换触发器主体 :NEW.created_by := USER;
这将告诉您触发器是否正常工作。
答案 1 :(得分:1)
我发现了两个潜在的问题。
其中一个原因是,您是否真正创建了触发器并不清楚。在您显示的示例代码中,您需要在触发器文本后面使用正斜杠(/
)来实际执行CREATE语句。您应该看到" Trigger created"如果成功创建。
另一个是你在创建触发器之前启用SERVEROUTPUT,这是无关紧要的。您需要在执行INSERT语句的会话中启用它。 (如果您在与CREATE相同的会话中执行INSERT,则不是问题。)
(另一个答案暗示你没有看到输出,因为触发器在会话之外执行。这是不正确的。)