kantagrawal Ответов: 2

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


Всем Привет,

У меня есть 4 таблицы Table1, Table2, Table3, Table4. Всякий раз, когда данные вставляются в таблицу 1, они также вставляются в таблицу 4. Аналогично, когда данные вставляются в таблицу 2, а данные таблицы 3 также вставляются в таблицу 4. таким образом, мы не можем создать внешний ключ на Table4.

поэтому, пожалуйста, скажите мне, как создать триггер на Table1, Table2 и Table3, чтобы сохранить строки, чтобы удалить его. если он существует в таблице 4.

Заранее спасибо.

Что я уже пробовал:

Создать триггер trgDeleteDebitVoucher на TblDebitVoucher для удаления
Как
Если существует (SELECT * FROM TblStatement Where ProjectNo In (Select NoteNo From TblDebitVoucher))
НАЧАТЬ
RAISERROR ('этот ваучер используется в таблице операторов, поэтому его нельзя удалить.', 16, 1);
инструкция ROLLBACK Transaction;
КОНЕЦ;

Tomas Takac

Я не понимаю, почему вы не можете создать внешний ключ, не могли бы Вы уточнить?

Peter Leow

Возможный. Например, значение внешнего ключа, существующее в таблице 1, не может быть вставлено в таблицу 4, если оно также не существует в других таблицах.

2 Ответов

Рейтинг:
1

Peter Leow

Сделайте шаг назад и переосмыслите свой дизайн. Есть ли другой способ обойти эту проблему с внешним ключом, ссылающимся на несколько таблиц? Как бы то ни было, существует также опасность вставки дубликата первичного ключа в несколько таблиц. Я предлагаю отдельную таблицу для хранения первичного ключа, а остальные четыре таблицы-для связи с ним через внешний ключ. А ты как думаешь?


kantagrawal

Уважаемый Петр Leow,
мы не вставляем один и тот же первичный ключ в таблицу 4. значения столбцов первичного ключа в таблицах Table1, Table2 и Table3 различны. и мы вставляем эти значения в таблицу 4. таким образом, они различны в колонке. но мы не можем установить этот столбец таблицы 4 как внешний ключ, потому что мы можем установить только один внешний ключ в столбце таблицы, который ссылается на первичный ключ. поэтому я думаю, что нам нужно создать триггер на Table1, Table2, Table3 для удаления. если это значение первичного ключа существует в таблице 4. если есть какая-то другая процедура, пожалуйста, скажите мне.

Peter Leow

Да, причина, по которой вы не можете использовать внешний ключ, заключается в том, что предполагаемый столбец внешнего ключа в таблице 4 ссылается на несколько таблиц 1, 2, 3, верно? Даже они различаются по значениям в таблицах 1, 2, 3. я все еще остаюсь при своем предложении. Дайте мне знать, если вы найдете решение триггера. Я всегда подготовиться к изучению.

Рейтинг:
0

dbrenth

В вашем триггере измените это

(SELECT * FROM TblStatement Where ProjectNo In (Select NoteNo From TblDebitVoucher))

ТО

(SELECT * FROM TblStatement Where ProjectNo In (Select NoteNo From deleted))


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

удачи
Брент