MySQL触发器中的"INSTEAD OF",从SQL Server转换而来



我正在将一些SQL Server触发器转换为MySQL,并且遇到了一些语法问题。其余的数据库架构和对象是使用 AWS 架构转换工具转换的,因为我正在将 SQL Server 数据库迁移到 Aurora RDS MySQL。以下是我在转换时遇到问题的触发器示例:

-- Create the UpdateAUD trigger on the new table.
CREATE TRIGGER [dbo].[UpdateAUD] ON [dbo].[AUD]
INSTEAD OF UPDATE
AS
BEGIN
IF @@ROWCOUNT > 0
BEGIN
RAISERROR( 'Audit rows for AUD cannot be updated!', -1, 0 );
ROLLBACK;
END
END;

我尝试过的代码如下所示:

DELIMITER $$
-- Create the UpdateAUD trigger on the new table.
CREATE TRIGGER dbo.UpdateAUD 
AFTER UPDATE
ON dbo.AUD FOR EACH ROW
BEGIN
set msg = ('Audit rows for AUD cannot be updated!');
signal sqlstate '45000' set message_text = msg;
ROLLBACK;
END$$

首先,AFTER可以取代INSTEAD OF吗?其次,MySQL工作台在RAISERROR方面存在问题,我已经查找了解决方法。但是,我得到的错误是围绕msg变量,它说Unknown system variable 'msg'

有什么想法吗?

它必须是更新前触发器,以便更新被中断

你也可以

REVOKE UPDATE ON AUD FROM '*'@'localhost';

所以没有人可以再更新表格

CREATE TABLE AUD (id int)
INSERT INTO AUD VALUES(1)
CREATE TRIGGER UpdateAUD 
BEFORE UPDATE
ON AUD FOR EACH ROW
BEGIN
set @msg := 'Audit rows for AUD cannot be updated!';
signal sqlstate '45000' set message_text = @msg;
END
UPDATE AUD SET  id = 1 WHERE id = 1
无法更新 AUD 的审核行!

db<>小提琴在这里

我最终修改为

DELIMITER $$
-- Create the UpdateAUD trigger on the new table.
CREATE TRIGGER dbo.UpdateAUD  
BEFORE UPDATE
ON dbo.AUD FOR EACH ROW
BEGIN
signal sqlstate '45000' set message_text = 'Audit rows for AUD cannot be updated!';
END$$

根据文档,不需要ROWCOUNT,因为FOR EACH ROW应该处理这个问题。就ROLLBACK而言,我检查了 https://dev.mysql.com/doc/refman/5.6/en/trigger-syntax.html,发现也应该处理它。

这看起来像是从顶部发布的原始MS-SQL的良好转换吗?

相关内容

  • 没有找到相关文章

最新更新