【问题标题】:sql trigger perform update on updatesql 触发器在更新时执行更新
【发布时间】:2012-02-02 04:37:51
【问题描述】:

我正在尝试编写一个 sql 触发器,该触发器将在执行更新时更新另一个表。这实际上用于替换复制(复制存在于我们的生产环境中,但不存在于开发环境中,因为它会导致开发问题)。 我已经编写了以下触发器来实现这一点,但它似乎不起作用,我不知道为什么。 (我也不知道如何调试触发器)

USE [AuditQuestionnaireManagerDemo]
GO
/****** Object:  Trigger [dbo].[CatchUpdateUser]    Script Date: 01/04/2012 09:25:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [dbo].[CatchUpdateUser]
   ON  [dbo].[User]
   FOR UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    update SharedServicesDemo.dbo.[User]
        set SharedServicesDemo.dbo.[User].Username = Username,
            SharedServicesDemo.dbo.[User].PasswordHash = PasswordHash,
            SharedServicesDemo.dbo.[User].Salt = Salt,
            SharedServicesDemo.dbo.[User].PersonGUID = PersonGUID,
            SharedServicesDemo.dbo.[User].OrganizationGUID = OrganizationGUID,
            SharedServicesDemo.dbo.[User].IsDeleted = IsDeleted,
            SharedServicesDemo.dbo.[User].IsActive = IsActive
        where SharedServicesDemo.dbo.[User].GUID = GUID
    SELECT GUID, ID, Username, PasswordHash, Salt, PersonGuid, OrganizationGUID, IsDeleted, IsActive From Inserted

END

如果有人能在这里发现问题,那就太好了!

此插入触发器确实适用于插入/选择组合:

SET IDENTITY_INSERT SharedServicesDemo.dbo.[User] ON
INSERT INTO SharedServicesDemo.dbo.[User] (GUID, ID, Username, PasswordHash, Salt, PersonGUID, OrganizationGUID, IsDeleted, IsActive)
SELECT GUID, ID, Username, PasswordHash, Salt, PersonGuid, OrganizationGUID, IsDeleted, IsActive From Inserted
SET IDENTITY_INSERT SharedServicesDemo.dbo.[User] OFF

【问题讨论】:

  • (这是 MS SQL Server 吗?)selectupdate 之后应该做什么?
  • @MAT:我假设用户试图将其用作更新的行集....
  • UPDATE/SELECT 组合看起来很奇怪。我希望在 UPDATE 之后有一个 ; 并且根本没有 SELECT。我不是 T-SQL 程序员,但在 PL/SQL 中,您可以通过在列名前添加 new. 来指定您需要新值。
  • 请参考此链接:stackoverflow.com/questions/642822/…问候
  • 请参考此链接:stackoverflow.com/questions/642822/…问候

标签: sql triggers


【解决方案1】:

您的触发器目前什么都不做(您很幸运(不幸?),因为语法编译但没有按照您的意图执行)。试试:

update SharedServicesDemo.dbo.[User] 
set  SharedServicesDemo.dbo.[User].Username = i.Username,
    SharedServicesDemo.dbo.[User].PasswordHash = i.PasswordHash,
    SharedServicesDemo.dbo.[User].Salt = i.Salt,
    SharedServicesDemo.dbo.[User].PersonGUID = i.PersonGUID,
    SharedServicesDemo.dbo.[User].OrganizationGUID = i.OrganizationGUID,
    SharedServicesDemo.dbo.[User].IsDeleted = i.IsDeleted,
    SharedServicesDemo.dbo.[User].IsActive = i.IsActive
From  SharedServicesDemo.dbo.[User]
inner join inserted i ON SharedServicesDemo.dbo.[User].GUID = i.GUID

参考:UPDATE

[可能需要为SharedServicesDemo.dbo.[User] 的第二个实例设置别名...]

【讨论】:

  • 必须将列名 Username、PasswordHash 等更改为 Inserted.Username 等,以使其在模棱两可的地方工作,但现在它就像一个魅力。你能解释一下为什么它不像我在第一篇文章中添加的插入触发器那样工作吗?
  • 就像我解释的那样,你的语法错误,但它编译后什么也没做。
猜你喜欢
  • 2013-12-11
  • 1970-01-01
  • 2021-10-13
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 2021-02-12
  • 2015-11-26
相关资源
最近更新 更多