Триггер обновления SQL Server - PullRequest
6 голосов
/ 04 января 2011

Я никогда раньше не использовал триггеры на сервере SQL, и я смотрел в Интернете, но не нашел ответа на свой вопрос. В основном я пытаюсь написать триггер, который будет запускаться после обновления записи в таблице. Этот триггер затем обновит две дополнительные таблицы на основе записи, которая была обновлена ​​в первой таблице.

Основная таблица с триггером будет обновлять одну запись, используя запрос, подобный следующему:

UPDATE E.SM_T_RList
SET IsActive = 0
WHERE Guid = @Guid

Затем я хочу, чтобы триггер сделал что-то вроде этого:

ALTER TRIGGER [E].[IsActiveUpdate] 
ON  [E].[SM_T_RList] 
AFTER UPDATE
AS
BEGIN

SET NOCOUNT ON;

UPDATE E.SM_T_BInfo
SET IsActive = 0
WHERE Guid = @Guid

UPDATE E.SM_T_RMachines
SET IsActive = 0
WHERE GUID = @GUID

END

Guid, который я хочу обновить, используется первичной таблицей. Но я не могу понять, как мне получить @Guid, который я хочу обновить в триггер? Пожалуйста, помогите.

Спасибо

Ответы [ 2 ]

12 голосов
/ 04 января 2011

Оба опубликованных ответа страдают от одной и той же проблемы - они помечают другие строки как неактивные, когда любое обновление происходит в вашей базовой таблице

Что-то вроде:

ALTER TRIGGER [E].[IsActiveUpdate] 
ON  [E].[SM_T_RList] 
AFTER UPDATE
AS
BEGIN

SET NOCOUNT ON;

UPDATE E.SM_T_BInfo
SET IsActive = 0
WHERE Guid IN (SELECT Guid FROM INSERTED where IsActive=0)

UPDATE E.SM_T_RMachines
SET IsActive = 0
WHERE Guid IN (SELECT Guid FROM INSERTED where IsActive=0)

END

Было бы более уместно

6 голосов
/ 04 января 2011

Триггеры в SQL Server работают с наборами строк, а не с отдельными строками. Вы получаете доступ к ним через псевдотаблицы inserted и deleted. Предполагая, что вам может потребоваться каскадное значение isactive, когда ранее неактивные строки стали активными, вы можете использовать что-то вроде этого.

ALTER TRIGGER [E].[IsActiveUpdate] 
ON  [E].[SM_T_RList] 
AFTER UPDATE
AS
BEGIN

SET NOCOUNT ON;

UPDATE E.SM_T_BInfo
SET IsActive = i.IsActive
FROM INSERTED i JOIN E.SM_T_BInfo e
ON e.Guid = i.Guid

UPDATE E.SM_T_RMachines
SET IsActive = i.IsActive
FROM INSERTED i JOIN E.SM_T_BInfo e
ON e.Guid = i.Guid

END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...