【问题标题】:SQLServer triggersSQLServer 触发器
【发布时间】:2010-04-08 11:08:55
【问题描述】:

请帮我编写一个向表中添加新行的触发器。

我的数据库中有 3 个表:

  1. 区域(ID、名称); id - 主要;
  2. 技术(ID、名称); id - 主要;
  3. 可用性(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 触发器中。 我想在添加新的技术行时做同样的事情。

【问题讨论】:

    标签: sql sql-server triggers


    【解决方案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 表插入记录的逻辑。

    【讨论】:

    • 你为什么会有这种感觉?触发器实际上只不过是在特定条件下自动运行的存储过程。使用触发器可以防止有人忘记/未能运行存储过程,从而强制执行该过程要解决的业务规则。
    • 另一方面,触发器充当意外存储过程。当您调用存储过程时,您知道它可能正在插入附件行;简单的插入语句并不那么清楚。当然,如果您使用存储过程,则必须取消对该表的插入权限。
    猜你喜欢
    • 2015-06-07
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多