Microsoft SQL到MySQL触发器

时间:2014-01-11 13:19:50

标签: mysql sql database triggers

我需要帮助将MS SQL触发器创建命令转换为MySQL中的类似命令。它在MS SQL中工作正常,但我对MySQL一无所知。

命令如下:

USE [Project]
GO

/****** Object:  Trigger [General].[TR_tblFirmaZaposleni_U]    Script Date: 7.1.2014 17:47:35 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [General].[TR_tblFirmaZaposleni_U]
ON [General].[tblFirmaZaposleni]
FOR UPDATE 
AS UPDATE [General].[tblFirmaZaposleni]
SET [A_tblFirmaZaposleniUpdatedBy] = SUBSTRING(SUSER_SNAME(),(CHARINDEX('\',SUSER_SNAME()) + 1),LEN(SUSER_SNAME())), [A_tblFirmaZaposleniUpdatedOn] = GetDate()
FROM  [General].[tblFirmaZaposleni] s
INNER JOIN [INSERTED] i ON s.[ZaposleniID] = i.[ZaposleniID]
INSERT INTO ProjectAudit.[General].[tblFirmaZaposleni] SELECT 'B','U',* FROM DELETED 
INSERT INTO ProjectAudit.[General].[tblFirmaZaposleni] SELECT 'A','U',* FROM INSERTED 
GO

1 个答案:

答案 0 :(得分:1)

尽管它们有明显的相似之处,但SQL Server和MySQL实际上是非常不同的产品:每种产品都以不同的方式偏离了SQL标准。事实上,随着人们更深入地研究其特征和功能,分歧明显扩大。

因此,SQL Server中的内容与MySQL中可以实现的内容之间没有1:1的映射关系。您最好能够了解系统之间的差异以及如何最好地管理迁移。很可能应该专门设计应用程序设计的重要元素,以便利用(或克服缺少)一个系统或另一个系统中存在的特性或功能。

如果确保数据库保持相似,MySQL中的一组等效命令将如下所示:

USE Project
DELIMITER ;;

CREATE TRIGGER TR_tblFirmaZaposleni_U
  BEFORE UPDATE ON tblFirmaZaposleni
FOR EACH ROW BEGIN

  SET NEW.A_tblFirmaZaposleniUpdatedBy = SUBSTRING_INDEX(CURRENT_USER, '@', 1),
      NEW.A_tblFirmaZaposleniUpdatedOn = CURRENT_DATE;

  INSERT INTO ProjectAudit.tblFirmaZaposleni VALUES
    ('B','U', OLD.colA, OLD.colB, OLD.colC, ....),
    ('A','U', NEW.colA, NEW.colB, NEW.colC, ....);

END;;

值得注意的是,与SQL Server中的SUSER_SNAME()一样,MySQL中的CURRENT_USER会返回运行触发器的用户,而不是客户端进行身份验证的用户。您可能希望使用MySQL的USER()函数。

值得注意的是,MySQL提供了Automatic Initialization and Updating for TIMESTAMP and DATETIME,这使您无需在触发器中设置此类值。

对于初始SET语句(对触发器没有影响),MySQL没有等效于SQL Server的ANSI_NULLS设置,但如果你设置了ANSI_QUOTES SQL模式希望实现与设置SQL Server的QUOTED_IDENTIFIER

相同的效果