Ведение строк в соединительной таблице SQL Server при вставке и обновлении строк в другой таблице

Можете ли вы показать пример кода для создания триггера или хранимой процедуры, которая поддерживает строки в таблице соединений SQL Server, когда вносятся изменения в таблицы Authors и BookTitles, такие как вставка и обновление строк в этих таблицах?

У нас есть следующие таблицы:

Authors:
ID
NAME
ZIP
AND SOME MORE COLUMNS

BookTitles:
ID
TITLE
ISBN
AND SOME MORE COLUMNS

This is the table we will use as our junction table:

AuthorTitles:
ID
AUTHOR_ID
BOOK_TITLE_ID

Мы хотели бы сделать это в триггере вместо того, чтобы делать кодирование в нашей форме VB.Net.

Вся помощь будет оценена.

Приведенные выше структуры таблиц были упрощены, чтобы показать, что мы пытаемся сделать.

Мы реализуем распределительную таблицу для учителей и программ.

Вот фото реальной системы:

1 ответ

Решение

Если у вас нет ограничений по внешнему ключу, для которых требуется по крайней мере одна книга на автора и / или наоборот, то единственные случаи, в которых вам потребуется специальная обработка, относятся к удалению для BookTitles или авторам. Их можно сделать так:

CREATE PROC BookTitle_Delete(@Book_ID As INT) As
 -- First remove any children in the junction table
 DELETE FROM AuthorTitles WHERE BOOK_TITLE_ID = @Book_ID

 -- Now, remove the parent record on BookTitles
 DELETE FROM BookTitles WHERE ID = @Book_ID

go

В общем, вы хотите не поддаваться искушению заниматься ведением таблиц и другими подобными вещами в триггерах. Поскольку триггеры невидимы, добавляются дополнительные издержки, могут возникнуть проблемы с обслуживанием администраторов баз данных, и могут возникнуть многие тонкие сложности транзакций / блокировок и проблемы с производительностью. Триггеры должны быть зарезервированы для простых вещей, которые действительно должны быть скрыты от клиентского приложения (например, для аудита), и которые практически невозможно реализовать каким-либо другим способом. Это не один из тех случаев.

Если вы действительно хотите "невидимый" способ сделать это, тогда просто используйте Cascading Foreign-Key. Я также не рекомендую это, но все же предпочтительнее триггера.

Другие вопросы по тегам