gpt4 book ai didi

oracle - 如何修复Oracle SQL中基本触发器未触发的问题

转载 作者:行者123 更新时间:2023-12-02 11:47:48 25 4
gpt4 key购买 nike

我一直在尝试让这个触发器工作,但由于某种原因,在我更新/插入表中的内容之前它甚至没有激活。此触发器的目的(并且我需要通过触发器执行此操作)是确保 DISCS 表中的所有条目的 FORMAT 属性中都具有“L”或“S”。如果不是,则不应插入/更新该条目。

我尝试添加一行来检查触发器是否被激活(“buenos dias”行),但似乎由于某种原因没有激活。我只是一个有触发器的初学者,我确信这个错误真的很愚蠢,但我就是找不到它。

触发器的代码是:

CREATE OR REPLACE TRIGGER FORMAT_T
BEFORE INSERT OR UPDATE OF FORMAT
ON DISCS
FOR EACH ROW
DECLARE
bad_format EXCEPTION;
BEGIN
DBMS_OUTPUT.PUT_LINE('Buenos dias.');
IF :NEW.FORMAT != 'S' AND :NEW.FORMAT != 'L' THEN
RAISE bad_format;
END IF;
EXCEPTION
WHEN bad_format THEN
DBMS_OUTPUT.PUT_LINE('Bad format, could not insert/update.');
END FORMAT_T;

一旦我编译触发器没有问题,我就会尝试更新以下行(使用第一行的 ID 只是为了能够轻松测试它):

UPDATE DISCS
SET FORMAT = 'W'
WHERE ID = 1;

这应该返回一个错误,因为我将其更新为的格式不是“L”也不是“S”,而是该行只是更新而没有问题,甚至没有弹出“buenos dias”行。 user_errors 表中也没有错误。

感谢您提前提供的帮助。

最佳答案

您发布的触发代码工作得很好。真正的问题是这样暴露的:

without the "buenos dias" line even popping up

显然,您正在禁用 DBMS_OUTPUT 的环境中运行。因此 UPDATE 按预期失败,您只是看不到该消息。我们可以通过从触发器代码中删除 EXCEPTION block 来轻松演示这一点,如 SQL Fiddle demonstrates .

启用 DBMS_OUTPUT 取决于您的执行环境。在 SQL*Plus 中运行 set serveroutput on。在 Oracle SQL Developer 中,选择 View> Dbms_Output 并设置连接。在 PL/SQL Developer 中,在 SQL 工作表上启用 DBMS_OUTPUT。等等。

<小时/>

顺便说一句,触发器是执行此规则的错误方法。正确的做法是在列上定义检查约束。

alter table disks add constraint disc_format_ck 
check (format in ('S', 'L'));

关于oracle - 如何修复Oracle SQL中基本触发器未触发的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55781763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com