我需要帮助将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
答案 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
。