SQL триггер не работает, когда данные отправляются из почтальона - PullRequest
0 голосов
/ 16 ноября 2018

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

Create TRIGGER trgAfterInsertFDs ON [dbo].MyTable
FOR INSERT,Delete
AS
    declare @id nvarchar(max)
    declare @Status nvarchar(100);

    select @id=i.ID from inserted i;    
    select @Status=i.[Status] from inserted i;  
    Delete from MyTable where ID=@id and [Status]='Closed'
GO

Я пробовал и другой путь. Для выгрузки автоматически сгенерированного идентификатора из моей таблицы в другую таблицу и записи еще одного триггера для удаления данных из моей таблицы.

Create TRIGGER trgAfterInsert ON [dbo].MyTable
FOR INSERT,Delete
AS
    declare @id nvarchar(max)
    declare @Status nvarchar(100);

    select @id=i.ID from inserted i;    
    select @Status=i.[Status] from inserted i;  
    Delete from MyTable where ID=@id and [Status]='Closed'
        Insert into ClosedID
    Select ID,[Status] from [dbo].MyTable where ID=@id and Status='Closed'
GO

таблица ClosedID:

Create table ClosedID 
  (ID int,Status nvarchar(max))


Create TRIGGER trgAfter ON ClosedID
FOR INSERT
AS
    declare @ID nvarchar(max)
    declare @Status nvarchar(100);

    select @id=i.ID from inserted i;    
    select @Status=i.Status from inserted i;    
    delete from [dbo].MyTable where id in (Select ID from ClosedID)
    --Delete  from ClosedID
GO

1 Ответ

0 голосов
/ 16 ноября 2018

В вашем первом триггере вам не нужно запускать на УДАЛИТЬ для ваших целей. Потому что вы хотите удалить для определенного условия, но если оно уже удалено, вам не нужно запускать его для удаления. И вы должны рассмотреть массовые вставки, ваш триггер должен покрыть его. Я упростила твой первый триггер. Кстати, обычно, если я хочу игнорировать некоторые записи вставки в таблице, я предпочитаю INSTEAD OF INSERT Триггер.

CREATE TRIGGER trgAfterInsertFDs ON [dbo].MyTable
FOR INSERT
AS
    DELETE FROM MyTable 
        WHERE EXISTS (SELECT 1 FROM INSERTED I WHERE MyTable.Id=I.Id AND I.[Status]='Closed')
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...