2017-01-03 34 views
0

我试图做一个触发器,将更新一个表只如果事情是插在其他表SQL触发器,应该更新其他表

CREATE TABLE Purchases 
(
PurchaseID INT IDENTITY NOT NULL PRIMARY KEY, 
DateBought SMALLDATETIME, 
Price MONEY CHECK (Price>0), 
RealEstateID INT UNIQUE NOT NULL, 
DealMadeByEmployeeID INT NOT NULL 
); 


INSERT INTO Purchases(DateBought, Price, RealEstateID, DealMadeByEmployeeID) 
VALUES ('20161015 15:10:03','120000',3, 3); --Апартамент 170 квадратни метра 

INSERT INTO Purchases(DateBought, Price, RealEstateID, DealMadeByEmployeeID) 
VALUES ('20161219 13:13:30','200000',4, 3); --Къща 500 квадратни метра 

INSERT INTO Purchases (Price,RealEstateID,DealMadeByEmployeeID) 
VALUES ('130000',6,3); --непродаден апартамент 

CREATE TABLE EmployeesSalary 
(
EmployeeID INT NOT NULL PRIMARY KEY, 
CurrentSalary MONEY DEFAULT 0,-- на процент 
MonthlySalesMade INT DEFAULT 0, 
MonthlyRentsMade INT DEFAULT 0 
); 

INSERT INTO EmployeesSalary (EmployeeID, CurrentSalary) 
VALUES (1, '400'); 

INSERT INTO EmployeesSalary (EmployeeID, CurrentSalary) 
VALUES (2, '400'); 

INSERT INTO EmployeesSalary (EmployeeID, CurrentSalary) 
VALUES (3, '400'); 

CREATE TRIGGER tr_EmployeesSalaryPurchasesUpdate --при INSERT в Purchases таблицата 
ON Purchases 
AFTER INSERT 
AS 
BEGIN 
    UPDATE EmployeesSalary 
    SET EmployeesSalary.MonthlySalesMade=EmployeesSalary.MonthlySalesMade+1 
    WHERE EmployeesSalary.EmployeeID IN (SELECT inserted.DealMadeByEmployeeID FROM inserted) 
END 

但是基于标识。 我的代码没有得到任何错误,但触发似乎不起作用。我的错误是什么?

https://postimg.org/image/rot0xcriv/

+0

请与图像停止。正如我在上次评论中所说的那样,我尝试了代码并且工作正常。你只是没有在创建触发器后在** Purchases **表中插入值 – Lamak

回答

1

如果除非NOCOUNT设置为ON有多个更新,它不会工作:

CREATE TRIGGER tr_EmployeesSalaryPurchasesUpdate 
ON Purchases 
AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON -- new line of code 
    UPDATE EmployeesSalary 
    SET EmployeesSalary.MonthlySalesMade=EmployeesSalary.MonthlySalesMade+1 
    WHERE EmployeesSalary.EmployeeID IN (SELECT inserted.DealMadeByEmployeeID FROM inserted) 
END 
2

您应该使用INNER JOIN有:

CREATE TRIGGER tr_EmployeesSalaryPurchasesUpdate --при INSERT в Purchases таблицата 
ON Purchases 
AFTER INSERT 
AS 
BEGIN 
    UPDATE ES 
    SET ES.MonthlySalesMade = ES.MonthlySalesMade+1 
    FROM EmployeesSalary ES 
    INNER JOIN INSERTED I 
     ON ES.EmployeeID = I.DealMadeByEmployeeID; 
END 
+0

我不知道为什么,但它没有工作... – MitkoZ

+0

@MitkoZ也许你需要'ISNULL',就像在@M .Ali的回答 – Lamak

+0

尝试过,但仍然没有工作... – MitkoZ

0
  1. 您也可以使用EXISTS操作。
  2. 如果在该列中存在空值,则还需要注意MonthlySalesMade列中的可能NULLS列,+1 update列将不起作用。

CREATE TRIGGER tr_EmployeesSalaryPurchasesUpdate 
ON Purchases 
AFTER INSERT 
AS 
BEGIN 
    UPDATE EmployeesSalary 
    SET MonthlySalesMade = ISNULL(MonthlySalesMade, 0)+1 
    WHERE EXISTS (SELECT 1 
        FROM inserted 
        WHERE EmployeesSalary.EmployeeID = inserted.DealMadeByEmployeeID) 
END 
+0

idk为什么但它没有工作.. – MitkoZ

+0

@MitkoZ你是什么意思的'没有工作'?你在想什么? –

+0

http://i65.tinypic.com/2z4xz49.jpg – MitkoZ