SQLServer触发器

SQLServer触发器,sql,sql-server,triggers,Sql,Sql Server,Triggers,请帮助我编写一个触发器,将新行添加到表中 我的数据库中有3个表: 地区(id、名称);id-主要 (身份证、姓名);id-主要 可用性(id、地区、技术、计数);id-主要,region-Regions.id上的外部,Technik-technics.id上的外部 我想在区域中添加行时为每一行添加可用性中的新行 有些人认为: procedure void OnAddNewRegion(int region) { foreach (Row r in Technic) {

请帮助我编写一个触发器,将新行添加到表中

我的数据库中有3个表:

  • 地区(id、名称);id-主要
  • (身份证、姓名);id-主要
  • 可用性(id、地区、技术、计数);id-主要,region-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触发器中。 我想在添加新行时也这样做。

    尝试类似的操作(假设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
    

    您没有说明区域如何与工艺连接,所以我交叉连接了它们(每个插入的区域,每个工艺都有一行)。

    在我看来,实现此特定业务/插入逻辑的更干净的解决方案是使用存储过程


    只需创建一个存储过程来处理将记录插入区域表的逻辑

    我猜连接是通过可用性表进行的,所以交叉连接似乎是正确的,为什么您会这样认为?触发器实际上只不过是在特定条件下自动运行的存储过程。使用触发器可以防止某人忘记/未能运行存储过程,从而强制执行该过程要处理的业务规则。另一方面,触发器充当意外存储过程。当您调用存储过程时,您知道它可能正在插入附件行;简单的insert语句就不那么清楚了。当然,如果使用存储过程,则必须取消对该表的insert权限。