SQL 删除前触发未正确将行插入审计 table

SQL trigger before delete not properly inserting rows into audit table

我一直盯着这段代码并在线查看发生了什么,但我似乎找不到问题所在。

当我 运行 时,更新触发器下方的代码按预期工作并将数据插入审计 table。当我尝试测试删除触发器时,删除按预期发生但没有行添加到审计 table。

None 我的 google 搜索得到了一个具体的答案。

这里是触发器和测试触发器的代码:

--14. PART 1: write stored triggers for update and deletion (idk how many I'm assuming 2)
CREATE TRIGGER Before_Person_Update
    BEFORE UPDATE ON Person
    FOR EACH ROW
INSERT INTO PersonHistoryTracker
SET action = 'update',
    personNumber_FK = OLD.personNumber,
    firstName = OLD.firstName,
    lastName = OLD.lastName,
    DOB = OLD.DOB,
    phoneNumber = OLD.phoneNumber,
    email = OLD.email,
    streetNumber = OLD.streetNumber,
    streetName = OLD.streetName,
    city = OLD.city,
    state = OLD.state,
    zipcode = OLD.zipcode,
    isACustomer = OLD.isACustomer,
    isAnEmployee = OLD.isAnEmployee,
    isAPublisherRep = OLD.isAPublisherRep,
    changedat = NOW();


CREATE TRIGGER Before_Person_Delete
BEFORE DELETE ON Person
FOR EACH ROW
INSERT INTO PersonHistoryTracker
SET action = 'delete',
    personNumber_FK = OLD.personNumber,
    firstName = OLD.firstName,
    lastName = OLD.lastName,
    DOB = OLD.DOB,
    phoneNumber = OLD.phoneNumber,
    email = OLD.email,
    streetNumber = OLD.streetNumber,
    streetName = OLD.streetName,
    city = OLD.city,
    state = OLD.state,
    zipcode = OLD.zipcode,
    isACustomer = OLD.isACustomer,
    isAnEmployee = OLD.isAnEmployee,
    isAPublisherRep = OLD.isAPublisherRep,
    changedat = NOW();


SHOW TRIGGERS;


SELECT personNumber, firstName, lastName, streetNumber, streetName, city, state
FROM Person
WHERE personNumber = "007";

UPDATE Person
SET
    lastName = "Johnson"
WHERE personNumber = "007";



SELECT personNumber, firstName, lastName, streetNumber, streetName, city, state
FROM Person
WHERE personNumber = "007";



SELECT * 
FROM Person;
DELETE FROM Person
WHERE personNumber = "006";
SELECT * 
FROM Person;

--14. PART 2: SHOW THAT TRIGGERS WORK AS INTENDED
SELECT * 
FROM PersonHistoryTracker;

这里是审计代码table:

-- -- -- -- -- -- -- -- -- PersonHistoryTracker -- -- -- -- -- -- -- -- -- 

-- Creating the PersonHistoryTracker Table
-- Primary Keys: newChangeStartDate, personNumber_FK
-- Foreign Key: personNumber_FK

CREATE TABLE PersonHistoryTracker
(
    changeNum INT DEFAULT 0,
    personNumber_FK VARCHAR(5),
    firstName VARCHAR(30) NOT NULL,
    lastName VARCHAR(30) NOT NULL,
    DOB DATE,
    phoneNumber VARCHAR(10),
    email VARCHAR(50),
    streetNumber VARCHAR(10),
    streetName VARCHAR(30),
    city VARCHAR(30),
    state CHAR(2),
    zipcode CHAR(5),
    isACustomer BOOLEAN,
    isAnEmployee BOOLEAN,
    isAPublisherRep BOOLEAN,
    action VARCHAR(30),
    changedat DATETIME,

    CONSTRAINT PersonHistoryTracker_PK PRIMARY KEY (changeNum, personNumber_FK),

    CONSTRAINT PersonHistoryTracker_FK FOREIGN KEY (personNumber_FK)
    REFERENCES Person(personNumber) ON DELETE CASCADE
    
);

*****更新:

我尝试创建一个新的删除触发器,它跟在另一个 table 之后,并审核 table 删除时的信息,旧的和新的触发器都无法删除,我是不知道为什么我看到它可能与 mySQL 中级联操作未正确处理的错误有关,但我不确定是否会收到任何帮助。

此问题是由 mySQL 十年来的一个错误引起的。由于某种原因由外键级联“触发”的删除触发器不会在 MySQL 中进行跟踪。我的解决方案是只删除审计中的外键约束 table 并通过触发器语句本身“手动导入”外键。