【问题标题】:Creating a Trigger to update创建要更新的触发器
【发布时间】:2017-03-27 00:08:45
【问题描述】:

我正在尝试创建一个触发器,该触发器将为正在更新的行填充一列。这是我所做的,但它不起作用:

CREATE TRIGGER PSL_Cases_Address
ON dbo.PSL_Cases
AFTER INSERT, UPDATE
AS
  BEGIN
      IF UPDATE(Permit_No) /*If column not affected skip*/
        BEGIN
            UPDATE psl_cases 
            SET address = (
                SELECT TOP 1 permits.address 
                FROM permits 
                LEFT OUTER JOIN PSL_Cases ON PSL_Cases.Permit_No=Permits.PermitsID 
                WHERE PSL_Cases.PSL_CasesID=PSL_CasesID
            ) 
            WHERE dbo.PSL_Cases.PSL_CasesID = PSL_CasesID;
        END
  END; 

任何想法我可能做错了什么?

【问题讨论】:

  • 当 order by 不存在时,您将不会得到想要的结果..使用 order by 使其具有确定性
  • 对于任何更新或插入语句,都会调用一次 SQL Server 触发器,并且会为您填充表 insertedupdated。这与例如 Firebird 不同,在 Firebird 中,每条更新或插入的记录都会调用一次触发代码。您的 SQL Server 触发器代码必须经过精心设计,才能与 insertedupdated 表一起使用。
  • @nolaspeaker:伪表是 InsertedDeleted - 没有 Updated ...
  • inserteddeleted 虚拟表的参考:Use the inserted and deleted Tables

标签: sql-server tsql sql-server-2012 database-trigger


【解决方案1】:

我想这就是你要找的东西

CREATE TRIGGER PSL_Cases_Address
ON dbo.PSL_Cases
AFTER INSERT, UPDATE
AS
 BEGIN
  IF UPDATE(Permit_No) /*If column not affected skip*/
    BEGIN

        UPDATE PSL_Cases

        SET PSL_Cases.[address] = permits.[address] 

        FROM inserted INNER JOIN PSL_Cases ON 

               inserted.[Permit_No] = PSL_Cases.[PermitsID]

         INNER JOIN permits

        ON inserted.[Permit_No] = Permits.[PermitsID]            

    END
END; 

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 2012-07-31
    • 2016-05-26
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多