Удалить проблему триггера с ON DELETE CASCADE на сервере SQL - PullRequest
2 голосов
/ 12 декабря 2011

У меня есть две таблицы на сервере Sql

Table A: Id UNIQUEIDENTIFIER NOT NULL
Table B: Id UNIQUEIDENTIFIER NOT NULL
         AId UNIQUEIDENTIFIER NOT NULL,ON DELETE CASCADE (This is Id of Table A)

(Примечание B содержит столбец AId, который ссылается на A с параметром ON DELETE CASCADE). B также имеет триггер удаления, например

CREATETRIGGER B_Delete_Trigger
ON [dbo].[B]
FOR DELETE
AS
SELECT * FROM DELETED AS B INNER JOIN A ON B.AId=A.Id

Теперь, когда я выполняю операцию удаления в таблице B, вышеуказанный триггер возвращает строки, но когда включен Таблица А ничего не возвращается.

Насколько я знаю, SQL Server сначала удаляет записи из дочерней таблицы (в данном случае B), а затем из родительского (в данном случае A), поэтому приведенный выше триггер должен возвращать некоторые записи в обоих случаях.

Пожалуйста, скажите мне, как получить доступ к записям родителей, или мое наблюдение неверно.

Ответы [ 4 ]

2 голосов
/ 30 апреля 2013

На самом деле, когда вы вызываете этот триггер в таблице А. Последовательность выполнения

  1. DELETE Запись из дочерней таблицы B.
  2. УДАЛИТЬ запись из родительской таблицы A.
  3. Триггерный звонок

И SELECT * FROM DELETED содержит только данные из таблицы A.

1 голос
/ 27 февраля 2012

Триггер «FOR» эквивалентен триггеру «AFTER».Триггер срабатывает после завершения операции удаления.Следовательно, к моменту запуска триггера удаления для B запись в таблице A уже исчезла.Насколько я знаю, не существует простого способа получить доступ к записи в таблице А.

0 голосов
/ 12 декабря 2011

Следует отметить следующие элементы:

  • В случае реляционной таблицы Parent-Child всегда пытайтесь создать trigger на родительской таблице для выполнения ON DELETE CASCADE
  • Child tableCASCADE with Parent.
  • ON DELETE CASCADE означает: при удалении элемента из родительской таблицы все элементы будут удалены из дочерней таблицы с удаленной ссылкой.

Hope you 'я получил, спасибо за ваше время.

0 голосов
/ 12 декабря 2011

Разве каскад при удалении не должен быть в родительской таблице?

Цель этого состоит в том, что, как только родитель удаляется, при условии, что есть другие таблицы, ссылающиеся на родителя, конечно (через ограничения FK), тогда все дочерние записи также будут удалены. Похоже, у вас все неправильно?

MSDN:

http://msdn.microsoft.com/en-us/library/aa933119(v=sql.80).aspx

...