2014-01-11 62 views
0

我需要將MS SQL觸發器創建命令轉換爲MySQL中類似命令的幫助。它在MS SQL中工作正常,但我對MySQL一無所知。Microsoft 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

儘管他們明顯的相似之處,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;; 

這可能是值得指出的是,像SUSER_SNAME()在SQL Server中,CURRENT_USER在MySQL返回觸發器正在運行的用戶,而不是客戶端通過身份驗證的用戶。您可能希望使用MySQL的USER()函數。

也可能值得注意的是,MySQL提供了Automatic Initialization and Updating for TIMESTAMP and DATETIME,這樣可以避免在觸發器中設置這些值。

至於初始SET語句(這對觸發沒有影響),MySQL有沒有等效於SQL Server的ANSI_NULLS設置,但如果你想達到同樣的效果,設置SQL Server的QUOTED_IDENTIFIER,你可以設置其ANSI_QUOTES SQL模式。

+0

非常感謝你,eggyal!你一直很有幫助。 –

+0

我想最有用的鏈接,我忽略了包括在我的回答中,是MySQL的['CREATE TRIGGER'語法](http://dev.mysql.com/doc/en/create-trigger.html)的文檔。 – eggyal

+0

再次感謝您。 –