SQLServer 触发器
Posted
技术标签:
【中文标题】SQLServer 触发器【英文标题】:SQLServer triggers 【发布时间】:2010-04-08 11:08:55 【问题描述】:请帮我编写一个向表中添加新行的触发器。
我的数据库中有 3 个表:
-
区域(ID、名称); id - 主要;
技术(ID、名称); id - 主要;
可用性(id、区域、技术、计数); id - 主要,区域 - Regions.id 上的外国,Technik - technics.id 上的外国。
我想在区域中添加行时为每个技术行在可用性中添加新行。
有点像:
procedure void OnAddNewRegion(int region)
foreach (Row r in Technic)
Availability.Rows.Add(new Row(id, region, r.Id, 0));
但在 SQL 触发器中。 我想在添加新的技术行时做同样的事情。
【问题讨论】:
【参考方案1】:尝试这样的事情(假设 Availability.id 是一个身份),它还将处理一次插入的多行:
CREATE TRIGGER TR_Regions ON Regions
FOR INSERT
AS
INSERT INTO Availability
(region, technic, count)
SELECT
i.id, t.id, 0
FROM INSERTED i
CROSS JOIN Technics t
GO
你没有说 Regions 如何与 Technics 结合,所以我交叉加入它们(每个插入的 Regions,每个 Technics 获得一行)。
【讨论】:
我猜 JOIN 是通过可用性表,所以交叉连接似乎是正确的【参考方案2】:在我看来,实现此特定业务/插入逻辑的更简洁的解决方案是使用存储过程。
只需创建一个存储过程来处理向 Region 表插入记录的逻辑。
【讨论】:
你为什么会有这种感觉?触发器实际上只不过是在特定条件下自动运行的存储过程。使用触发器可以防止有人忘记/未能运行存储过程,从而强制执行该过程要解决的业务规则。 另一方面,触发器充当意外存储过程。当您调用存储过程时,您知道它可能正在插入附件行;简单的插入语句并不那么清楚。当然,如果您使用存储过程,则必须取消对该表的插入权限。以上是关于SQLServer 触发器的主要内容,如果未能解决你的问题,请参考以下文章