Как извлечь данные в триггере из таблицы заголовков, которая уже была удалена - PullRequest
0 голосов
/ 18 января 2011

У меня есть ситуация, когда у меня есть заголовок и таблица сведений. Таблица сведений имеет отношение внешнего ключа к таблице заголовка с каскадным удалением.

При удалении подробных записей мне нужно обновить другие таблицы с помощью триггера. У меня проблема в том, что мне нужно извлечь некоторую информацию из таблицы заголовков, а также из таблицы сведений для удаленных записей. Если я удаляю записи сведений, а затем запись заголовка, кажется, что триггер работает нормально. Тем не менее, если я удаляю запись заголовка, которая, в свою очередь, удаляет подробные записи из-за каскадного удаления, то при выполнении триггера запись заголовка уже удалена, и я не могу получить доступ к необходимой мне информации.

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

Вот мой код:

ALTER TRIGGER [Detail_Delete]
   ON [Detail]
   AFTER DELETE
AS 
BEGIN
 SET NOCOUNT ON;

 DECLARE @Table UpdateTableType

 -- Here is where the problem lies.
 -- No records are found here because the Header record isn't found.
 INSERT @Table
 (HeaderID, UserID)
 SELECT d.HeaderID, h.UserID
 FROM deleted d
 JOIN Header h ON h.HeaderID = d.HeaderID

 EXECUTE sp_UpdateSummary
  @Table = @Table
END

Ответы [ 2 ]

3 голосов
/ 18 января 2011

Я бы не использовал каскадное удаление, потому что, как вы видели, удаленные родительские данные недоступны

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

ALTER TRIGGER [Header_Delete]
   ON [Header]
   INSTEAD OF DELETE
AS 
BEGIN
 SET NOCOUNT ON;

 DECLARE @Table UpdateTableType

 -- DELETED has data, even though Header has not yet been touched
 INSERT @Table
 (HeaderID, UserID)
 SELECT d.HeaderID, d.UserID
 FROM deleted

 DELETE Detail WHERE ... (using @Table)

 DELETE Other WHERE ... (using @Table)

 DELETE Header WHERE ... (using @Table)

 EXECUTE sp_UpdateSummary
  @Table = @Table ...
END
0 голосов
/ 18 января 2011

Если запись Header удаляется первой, у вас нет доступа к ней, когда запускается триггер Detail -Record, поскольку записи Header уже удалены.

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