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 触发器的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver触发器如何知道当前处理啥类型的触发

sqlserver 2005 触发器,的小问题

java如何在sqlserver触发器里面调用webservice接口

sqlserver2005触发器问题

sqlserver,触发器做备份表如何插入当前时间?

SQLserver中的触发器,实现一个表的某字段修改后,另一张表的对应字段也修改