Ведение строк в соединительной таблице 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. Я также не рекомендую это, но все же предпочтительнее триггера.