Удалить записи в триггере вместо удаления - PullRequest
4 голосов
/ 16 июля 2010

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

Есть ли способ выполнить фактическое удаление в триггере "вместо удаления" без повторного запуска триггера?

Или лучший способ получения текстовых полей после удаления строки для сохранения в новой записи?

Ответы [ 4 ]

11 голосов
/ 16 июля 2010

Этот метод должен помочь.Вместо триггера будет выполнено все, что вы укажете, вместо автоматического удаления.Это означает, что ключ заключается в том, что вы делаете в нем удаление вручную, иначе запись не будет удалена.Это не будет работать рекурсивно.Это можно сделать только для таблицы без включенного каскадного удаления.По сути, уловка заключается в том, что вы присоединяетесь к исходной таблице в поле id, чтобы получить данные из поля, к которому у вас нет доступа, в удаленной псевдостали.для varchar (max) или nvarchar (max) это лучшее решение.Текст и ntext устарели и должны быть полностью удалены из SQL Server в следующей версии.

2 голосов
/ 23 ноября 2018

Ни один из приведенных выше ответов не работал для меня, я предполагаю, что люди использовали SQL 2008, поэтому этот ответ работает для SQL 2012

CREATE TRIGGER People_LogTriggerDelete ON People
INSTEAD OF DELETE
AS
SET NOCOUNT ON;
INSERT INTO People_AuditLog (Event, Date, Id, Name, LastName, SqlUser)
       SELECT 'DELETE', GETDATE(), d.Id, d.Name, d.LastName, CONCAT(SUSER_SNAME(),'/',@@SERVERNAME)
       FROM People t INNER JOIN deleted d ON t.Id = d.Id

DELETE People FROM People JOIN deleted ON People.Id = deleted.Id
2 голосов
/ 16 июля 2010

Вероятно, лучше сделать это после запуска.Менее сложный.

Если у вас есть следующие таблицы

CREATE TABLE [dbo].[Data](
[DocumentID] [smallint] NULL,
[Data] [nvarchar](max) NULL
) 

и

CREATE TABLE [dbo].[Audit](
[DocumentID] [smallint] NULL,
[Data] [nvarchar](max) NULL
) 

Следующий триггер After должен вставлять строку в таблицу аудита всякий раз, когда строкаудалено из таблицы данных

Create Trigger audit_Table_Deletes on dbo.Data for delete 
as
if @@rowcount = 0 return;
Insert into audit (DocumentID, Data) Select DocumentID, Data from deleted;
Go
0 голосов
/ 16 июля 2010

Мне когда-то нужно было ловить записи, которые были удалены; Я написал триггер, который будет копировать записи в другую таблицу с той же структурой, что и первая: она работала примерно так:

create trigger [delta_del] on [customer]
for delete
as

declare <variables> from deleted;
open mycurs
fetch next from mycurs into @v1, @v2
while (@@fetch_status = 0
begin
insert into delta (fields) values (@v1, @v2)
fetch next from mycursor into @v1, @v2
end

close mycursor
deallocate mycursor

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