Я занимаюсь преобразованием некоторых триггеров SQL Server в MySQL и столкнулся с некоторыми проблемами синтаксиса. Остальная часть схемы базы данных и объекты были преобразованы с помощью AWS Schema Conversion Tool, поскольку я переношу базу данных 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 Workbench есть проблема с RAISERROR, для которой я искал обходные пути. Однако ошибка, которую я получаю, связана с переменной msg
, где написано Unknown system variable 'msg'
Есть идеи?
Я предлагаю прочитать документацию по каждому продукту, чтобы определить, как работают части синтаксиса. И не помечайте SQL Server, поскольку вы ищете кого-то с опытом работы с MySQL.
Это то, с чем вы можете лучше справиться, отказав разрешениям UPDATE для выбранных пользователей, что намного лучше, чем триггеры. Как в SQL Server, так и в MySQL.
Я также пометил там SQL, поскольку исходный синтаксис исходит из базы данных SQL Server, и его функциональность должна быть продублирована в MySQL.
Пожалуйста, используйте тег sql для языка SQL, независимо от какой-либо реализации, и тег sql-server для Microsoft SQL Server.
Не помечайте SQL Server, потому что эксперт по SQL Server не обязательно является экспертом по MySQL. И вместо того, чтобы говорить, что мне нужна эта функциональность, реализованная в SQL Server, объясните свои фактические требования независимо от RBDMS.