1

当对 Authors 和 BookTitles 表进行更改(例如在这些表中插入和更新行)时,您能否展示创建触发器或存储过程以维护 SQL Server 联结表的行的示例编码?

我们有以下表格:

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 表单中进行编码。

所有帮助将不胜感激。

上面的表格结构被简化以显示我们正在尝试做的事情。

我们正在为教师和项目实施一个连接表。

这是实际系统的照片:

4

1 回答 1

2

除非您的外键约束要求每个作者至少有一本书和/或反之亦然,否则您应该需要特殊处理的唯一情况是删除书名或作者。他们可以这样做:

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

通常,您要抵制在触发器中进行表维护和其他类似操作的诱惑。由于触发器是不可见的,因此会增加额外的开销,可能会导致 DBA 出现维护问题,并可能导致许多微妙的事务/锁定复杂性和性能问题。触发器应该保留用于真正应该对客户端应用程序隐藏的简单事情(如审计),并且不能以其他方式实际实现。这不是其中一种情况。

如果你真的想要一种“不可见”的方式来做到这一点,那么只需实现一个级联外键。我也不推荐这样做,但它仍然比触发器更可取。

于 2012-07-14T14:25:23.720 回答