无法 CREATE/DELETE 触发
Cannot CREATE/DELETE Trigger
我正在尝试重新创建一个我之前创建并删除的触发器。
删除SQL:
DROP TRIGGER openitdb.trgLicenseInsert;
删除错误:
Error Code: 1360. Trigger does not exist
创作SQL:
DELIMITER $$
CREATE TRIGGER trgLicenseInsert
AFTER UPDATE ON SoftwareLicenseDetails
FOR EACH ROW BEGIN
INSERT INTO audithistory (audit_date, audit_field, audit_oldvalue, audit_changelog_fk, audit_newvalue, audit_assetid_fk) VALUES (Now(),'Software License Details', (SELECT Title FROM SoftwareTypes WHERE ID = (SELECT SoftwareNameFK
FROM SoftwareLicenseDetails
WHERE ComputerFK=new.ComputerFK
ORDER BY ID Desc
LIMIT 1)), (SELECT MAX(ID) FROM Changelog as ChangelogID ), 'License Added',new.ComputerFK);
END; $$
DELIMITER ;
创建错误:
Error Code: 1359. Trigger already exists
触发器没有出现在 MySQL Workbench 中,但不知何故它被标记为已经存在。
SHOW TRIGGERS
:
我该如何解决这个问题?我错过了什么吗?
编辑:
我尝试组合两个触发器,但在第 6 行出现错误 (IF new.Flag = 0 ..)
DELIMITER $$
CREATE TRIGGER trgSoftwareLicenseDetails
AFTER UPDATE ON SoftwareLicenseDetails
FOR EACH ROW BEGIN
IF new.Flag = 0 THEN
INSERT INTO audithistory (audit_date, audit_field, audit_oldvalue, audit_changelog_fk, audit_newvalue, audit_assetid_fk) VALUES (Now(),'Software License Details', (SELECT Title FROM SoftwareTypes WHERE ID =
(SELECT SoftwareNameFK FROM SoftwareLicenseDetails
WHERE ComputerFK=new.ComputerFK
ORDER BY ID Desc
LIMIT 1)), (SELECT MAX(ID) FROM Changelog as ChangelogID ), 'License Added',new.ComputerFK);
FROM SoftwareLicenseDetails
WHERE ComputerFK=new.ComputerFK
ORDER BY ID Desc
LIMIT 1)), (SELECT MAX(ID) FROM Changelog as ChangelogID ), 'License Added',new.ComputerFK);
ELSE IF new.Flag = 1 THEN
INSERT INTO audithistory (audit_date, audit_field, audit_oldvalue, audit_changelog_fk, audit_newvalue, audit_assetid_fk) VALUES (Now(),'Software License Details', 'N/A', (SELECT MAX(ID) FROM Changelog as ChangelogID ), 'License Deleted',old.ComputerFK);
END IF;
END; $$
DELIMITER ;
根据 show triggers 命令,trgLicenseDelete 触发器附加到更新事件之后。但是,您尝试通过将 trgLicenseInsert 附加到同一事件(更新后)来创建它,因此 mysql 认为 trgLicenseInsert 触发器重复,即使它们的名称不同。显然,您不能删除名称不存在的触发器。
如果更新后两个触发器都需要 运行,那么我建议您将它们的功能合并到一个触发器中,或者您需要将 2 个触发器附加到不同的事件。
但是,您可能使用的是旧版本的 mysql,因为如果重复是由于同一事件而不是相同的名称,则较新的版本会产生不同的错误消息,请参阅 mysql bug 10946
我正在尝试重新创建一个我之前创建并删除的触发器。
删除SQL:
DROP TRIGGER openitdb.trgLicenseInsert;
删除错误:
Error Code: 1360. Trigger does not exist
创作SQL:
DELIMITER $$
CREATE TRIGGER trgLicenseInsert
AFTER UPDATE ON SoftwareLicenseDetails
FOR EACH ROW BEGIN
INSERT INTO audithistory (audit_date, audit_field, audit_oldvalue, audit_changelog_fk, audit_newvalue, audit_assetid_fk) VALUES (Now(),'Software License Details', (SELECT Title FROM SoftwareTypes WHERE ID = (SELECT SoftwareNameFK
FROM SoftwareLicenseDetails
WHERE ComputerFK=new.ComputerFK
ORDER BY ID Desc
LIMIT 1)), (SELECT MAX(ID) FROM Changelog as ChangelogID ), 'License Added',new.ComputerFK);
END; $$
DELIMITER ;
创建错误:
Error Code: 1359. Trigger already exists
触发器没有出现在 MySQL Workbench 中,但不知何故它被标记为已经存在。
SHOW TRIGGERS
:
我该如何解决这个问题?我错过了什么吗?
编辑:
我尝试组合两个触发器,但在第 6 行出现错误 (IF new.Flag = 0 ..)
DELIMITER $$
CREATE TRIGGER trgSoftwareLicenseDetails
AFTER UPDATE ON SoftwareLicenseDetails
FOR EACH ROW BEGIN
IF new.Flag = 0 THEN
INSERT INTO audithistory (audit_date, audit_field, audit_oldvalue, audit_changelog_fk, audit_newvalue, audit_assetid_fk) VALUES (Now(),'Software License Details', (SELECT Title FROM SoftwareTypes WHERE ID =
(SELECT SoftwareNameFK FROM SoftwareLicenseDetails
WHERE ComputerFK=new.ComputerFK
ORDER BY ID Desc
LIMIT 1)), (SELECT MAX(ID) FROM Changelog as ChangelogID ), 'License Added',new.ComputerFK);
FROM SoftwareLicenseDetails
WHERE ComputerFK=new.ComputerFK
ORDER BY ID Desc
LIMIT 1)), (SELECT MAX(ID) FROM Changelog as ChangelogID ), 'License Added',new.ComputerFK);
ELSE IF new.Flag = 1 THEN
INSERT INTO audithistory (audit_date, audit_field, audit_oldvalue, audit_changelog_fk, audit_newvalue, audit_assetid_fk) VALUES (Now(),'Software License Details', 'N/A', (SELECT MAX(ID) FROM Changelog as ChangelogID ), 'License Deleted',old.ComputerFK);
END IF;
END; $$
DELIMITER ;
根据 show triggers 命令,trgLicenseDelete 触发器附加到更新事件之后。但是,您尝试通过将 trgLicenseInsert 附加到同一事件(更新后)来创建它,因此 mysql 认为 trgLicenseInsert 触发器重复,即使它们的名称不同。显然,您不能删除名称不存在的触发器。
如果更新后两个触发器都需要 运行,那么我建议您将它们的功能合并到一个触发器中,或者您需要将 2 个触发器附加到不同的事件。
但是,您可能使用的是旧版本的 mysql,因为如果重复是由于同一事件而不是相同的名称,则较新的版本会产生不同的错误消息,请参阅 mysql bug 10946