任何人都可以帮助我如何从现有的 MS SQL 触发器逻辑中执行 MySQL 触发器逻辑
Can anyone help me out how to perform MySQL trigger logic from existing MS SQL trigger Logic
我有两个 tables,一个是 Master table,每日数据不断加载。另一个是 Audit Table,它会在 Master Table 上发生更新(single/multiple 列更新)时进行跟踪。以下是用于 MS SQL
的逻辑
/*** Mastertable creation **/
CREATE TABLE [dbo].[Master](
[ID] [uniqueidentifier] primary key NOT NULL DEFAULT (newid()),
[Name] [varchar](100) ,
[Status] [varchar](10),
[Dept] [varchar](10) )
/** Inserting Data to Master table ***/
Insert into [dbo].[Master] ([Name],[Status],[Dept]) Values
('AAAA', 'Open','EC'),
('BBBB', 'Closed','CS')
/** Audit Table creation ***/
CREATE TABLE [dbo].[Orders_Audit](
[Id] [uniqueidentifier] NOT NULL,
[ColName] [varchar](50),
[OldValue] [varchar](200),
[NewValue] [varchar](200),
[ModifiedAt] [datetime],
[ModifiedBy] [varchar](50) )
Go
/*** Trigger used based on columns for any updates in Master Table***/
Create TRIGGER [dbo].[Tr_Master]
ON [dbo].[Master]
FOR UPDATE
AS
BEGIN
Declare @action varchar(50)
IF UPDATE([Status])
BEGIN
SET @Action = 'Status'
Insert into [dbo].[Orders_Audit] (Id,ColName,OldValue,NewValue,ModifiedAt,ModifiedBy)
select i.Id,@action ,d.[Status] ,i.[Status] ,getdate() ,SUSER_SNAME()
from inserted i,
deleted d where i.Id = d.Id
END
IF UPDATE([Dept])
BEGIN
SET @Action = 'Dept'
Insert into [dbo].[Orders_Audit] (Id,ColName,OldValue,NewValue,ModifiedAt,ModifiedBy)
select i.Id,@action ,d.[Dept] ,i.[Dept] ,getdate() ,SUSER_SNAME()
from inserted i,
deleted d where i.Id = d.Id
END
End
GO
需要在 MySQL 中实现相同的逻辑
提前致谢!!
CREATE TRIGGER trigger_name
AFTER UPDATE ON Master
FOR EACH ROW
BEGIN
IF NOT (OLD.Status <=> NEW.Status) THEN
INSERT INTO Orders_Audit (Id, ColName, OldValue, NewValue, ModifiedAt, ModifiedBy)
SELECT NEW.Id, 'Status', OLD.Status, NEW.Status, NOW(), CURRENT_USER();
END IF;
IF NOT (OLD.Dept <=> NEW.Dept) THEN
INSERT INTO Orders_Audit (Id, ColName, OldValue, NewValue, ModifiedAt, ModifiedBy)
SELECT NEW.Id, 'Dept', OLD.Dept, NEW.Dept, NOW(), CURRENT_USER();
END IF;
END
IF NOT (OLD.column <=> NEW.column)
检查列值是否已更改。此表达式是 NULL-safe(而不是 IF OLD.column <> NEW.column
)- 即当其中一个值或两个值都为 NULL 时,它会正确检查结果。
PS。 CURRENT_USER()
returns 用于身份验证的帐户名。如果您在身份验证期间需要客户端提供的用户名,请改用 USER()
函数。示例:用户可以提供 'john'@'1.2.3.4'
(和 USER()
return 这个)但是使用的帐户可能是 'john'@'%'
(和 CURRENT_USER()
return 这个).对于存储的 objects/views CURRENT_USER()
可能 return 不是调用者而是定义者帐户(取决于 SECURITY 属性)。
我有两个 tables,一个是 Master table,每日数据不断加载。另一个是 Audit Table,它会在 Master Table 上发生更新(single/multiple 列更新)时进行跟踪。以下是用于 MS SQL
的逻辑/*** Mastertable creation **/
CREATE TABLE [dbo].[Master](
[ID] [uniqueidentifier] primary key NOT NULL DEFAULT (newid()),
[Name] [varchar](100) ,
[Status] [varchar](10),
[Dept] [varchar](10) )
/** Inserting Data to Master table ***/
Insert into [dbo].[Master] ([Name],[Status],[Dept]) Values
('AAAA', 'Open','EC'),
('BBBB', 'Closed','CS')
/** Audit Table creation ***/
CREATE TABLE [dbo].[Orders_Audit](
[Id] [uniqueidentifier] NOT NULL,
[ColName] [varchar](50),
[OldValue] [varchar](200),
[NewValue] [varchar](200),
[ModifiedAt] [datetime],
[ModifiedBy] [varchar](50) )
Go
/*** Trigger used based on columns for any updates in Master Table***/
Create TRIGGER [dbo].[Tr_Master]
ON [dbo].[Master]
FOR UPDATE
AS
BEGIN
Declare @action varchar(50)
IF UPDATE([Status])
BEGIN
SET @Action = 'Status'
Insert into [dbo].[Orders_Audit] (Id,ColName,OldValue,NewValue,ModifiedAt,ModifiedBy)
select i.Id,@action ,d.[Status] ,i.[Status] ,getdate() ,SUSER_SNAME()
from inserted i,
deleted d where i.Id = d.Id
END
IF UPDATE([Dept])
BEGIN
SET @Action = 'Dept'
Insert into [dbo].[Orders_Audit] (Id,ColName,OldValue,NewValue,ModifiedAt,ModifiedBy)
select i.Id,@action ,d.[Dept] ,i.[Dept] ,getdate() ,SUSER_SNAME()
from inserted i,
deleted d where i.Id = d.Id
END
End
GO
需要在 MySQL 中实现相同的逻辑 提前致谢!!
CREATE TRIGGER trigger_name
AFTER UPDATE ON Master
FOR EACH ROW
BEGIN
IF NOT (OLD.Status <=> NEW.Status) THEN
INSERT INTO Orders_Audit (Id, ColName, OldValue, NewValue, ModifiedAt, ModifiedBy)
SELECT NEW.Id, 'Status', OLD.Status, NEW.Status, NOW(), CURRENT_USER();
END IF;
IF NOT (OLD.Dept <=> NEW.Dept) THEN
INSERT INTO Orders_Audit (Id, ColName, OldValue, NewValue, ModifiedAt, ModifiedBy)
SELECT NEW.Id, 'Dept', OLD.Dept, NEW.Dept, NOW(), CURRENT_USER();
END IF;
END
IF NOT (OLD.column <=> NEW.column)
检查列值是否已更改。此表达式是 NULL-safe(而不是 IF OLD.column <> NEW.column
)- 即当其中一个值或两个值都为 NULL 时,它会正确检查结果。
PS。 CURRENT_USER()
returns 用于身份验证的帐户名。如果您在身份验证期间需要客户端提供的用户名,请改用 USER()
函数。示例:用户可以提供 'john'@'1.2.3.4'
(和 USER()
return 这个)但是使用的帐户可能是 'john'@'%'
(和 CURRENT_USER()
return 这个).对于存储的 objects/views CURRENT_USER()
可能 return 不是调用者而是定义者帐户(取决于 SECURITY 属性)。