триггер не обновляет sql - PullRequest
1 голос
/ 26 мая 2011

Несмотря на то, что это завершено успешно по завершении, оно не имеет нужного обновления.

CREATE TRIGGER Trigger1
On dbo.[table1] 
FOR UPDATE
AS
Declare @Id int;
SELECT @Id = Issue_Id FROM dbo.[table1]

INSERT INTO dbo.[storage]
    SELECT Id, Title, project, Problem
    FROM dbo.[table2]
    WHERE Id = @Id

Что-то я делаю неправильно или я не могу использовать переменные в области действия триггера?

Большое спасибо

Ответы [ 5 ]

4 голосов
/ 26 мая 2011

Для поддержки многорядных обновлений

CREATE TRIGGER Trigger1 On dbo.[table1] FOR UPDATE
AS
SET NOCOUNT ON

INSERT INTO dbo.[storage]
    SELECT t.Id, t.Title, t.project, t.Problem
    FROM dbo.[table2] t
        JOIN INSERTED I ON t.ID = I.ID
GO

Если table2 на самом деле является table1 (что имеет больше смысла: как table1 относится к storage и table2?) ...

CREATE TRIGGER Trigger1 On dbo.[table1] FOR UPDATE
AS
SET NOCOUNT ON

INSERT INTO dbo.[storage]
    SELECT Id, Title, project, Problem
    FROM INSERTED
GO
2 голосов
/ 26 мая 2011

Для обработки нескольких обновлений и таблицы inserted за один раз:

CREATE TRIGGER Trigger1
On dbo.[table1] 
FOR UPDATE
AS

INSERT INTO dbo.[storage]
    SELECT Id, Title, project, Problem
    FROM dbo.[table2] t2
         JOIN Inserted i ON i.Issue_ID = t2.Id
2 голосов
/ 26 мая 2011

Пожалуйста, пройдите нижеприведенное предложение.

Вместо строки ниже

SELECT @Id = Issue_Id FROM dbo.[table1]

Это должно было быть следующим.

SELECT Issue_Id FROM Inserted

Ниже обновлено.

CREATE TRIGGER Trigger1
On dbo.[table1] 
FOR UPDATE
AS
SET NOCOUNT ON
Declare @Id int;

With CTE as 
(
    SELECT Issue_Id FROM Inserted I
    Inner Join [table1] T on T.Issue_Id  = I.Issue_Id
)

INSERT INTO dbo.[storage]
SELECT Id, Title, project, Problem
FROM dbo.[table2]
Inner Join CTE c on c.Issue_Id = Id

Для получения дополнительной информации

На сервере SQL записи, которые вставляются / модифицируются или удаляются, занимают две временные таблицы, доступные в триггере DML.Эти таблицы вставлены и удалены.В таблицу INSERTED вставлены или обновлены записи.Таблица DELETED имеет старое состояние записей, которые обновляются или удаляются.

1 голос
/ 26 мая 2011

ниже строки должно быть удалено

SELECT @Id = Issue_Id FROM dbo. [Table1]

Должно быть следующее.

SELECT Issue_Id FROM Inserted

1 голос
/ 26 мая 2011

Другие правильно ответили, что вы должны использовать inserted и объединение, чтобы построить правильный триггер. Но:

Исходя из ваших комментариев к ответам других пользователей, вы никогда не должны пытаться получить доступ к какому-либо ресурсу вне вашей собственной базы данных из триггера, пусть с другого сервера.

Попробуйте отделить действие триггера от активности между серверами - скажем, ваш триггер добавляет строку в таблицу очередей (или использует очереди реального сервисного брокера), а независимый компонент отвечает за обслуживание этих запросов.

В противном случае, если есть, например, проблемы с сетью, не только прерывает ваш триггер, но и вызывает откат для исходного обновления - это делает вашу локальную базу данных непригодной для использования.

Это также означает, что независимый компонент может справиться с таймаутами и выполнить соответствующие повторные попытки и т. Д.

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