2017-01-03 11 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. Кроме того, наличие возможных NULLS в столбце MonthlySalesMade, +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 что вы подразумеваете под 'did not work'? что вы пытаетесь? –

+0

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

Смежные вопросы