hat*_*enn 1 sql database sql-server triggers sql-update
有一个数据库表有一个更新触发器.每当更新列时,都会自动计算其中一列.
我已经调整了触发器,我想再次在所有行上运行它.在SQL Server Management Studio中,如果我在表上选择"编辑前200行"并编辑其中一行,则更新触发器可以正常工作.但是当我写一个像这样的查询时:
UPDATE MyTable
SET SomeIrrelevantColumn = 0
Run Code Online (Sandbox Code Playgroud)
触发器不起作用,应该由触发器计算的列保持不变.
如何在所有行上手动运行触发器?
编辑:这是触发器:
USE [MY_DATABASE]
GO
/****** Object: Trigger [dbo].[MY_TABLE_AUER] Script Date: 04/24/2013 00:05:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[MY_TABLE_AUER]
ON [dbo].[MY_TABLE]
AFTER UPDATE
AS
DECLARE @UPD_COLUMN_A int,
@INS_COLUMN_A int,
@UPD_COLUMN_B int,
@UPD_COLUMN_C varchar(255),
@UPD_COLUMN_D varchar(255),
@UPD_COLUMN_E int,
@UPD_COLUMN_F datetime
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT @UPD_COLUMN_A = _Column_A,
@UPD_COLUMN_B =_Column_B,
@UPD_COLUMN_C = COLUMN_C,
@UPD_COLUMN_D = [Column_D]
FROM DELETED;
IF @UPD_COLUMN_D not like '%SomeString%'
BEGIN
SELECT @INS_COLUMN_A = _Column_A
FROM INSERTED;
IF @UPD_COLUMN_A != @INS_COLUMN_A
BEGIN
SELECT @UPD_COLUMN_E = MAX([_Column_B]),
@UPD_COLUMN_F = MAX([_Column_G])
FROM MY_TABLE
WHERE COLUMN_C = @UPD_COLUMN_C
AND [Column_D] LIKE '%SomeString%';
UPDATE MY_TABLE
SET COLUMN_E = @UPD_COLUMN_E,
COLUMN_F = @UPD_COLUMN_F
WHERE [_Column_B] = @UPD_COLUMN_B;
UPDATE MY_TABLE
SET COLUMN_H = @UPD_COLUMN_B
WHERE [_Column_B] = @UPD_COLUMN_E;
END
END
END
Run Code Online (Sandbox Code Playgroud)
您的触发器是一个非常常见但错误的假设,即每行执行一次.它没有,它每次执行一次 - 所以当你更新整个表时,我敢打赌,如果你仔细观察,你会看到一行被更新了.*感谢Aaron Bertrand对这个介绍段落的评论.
您需要了解如何基于JOIN(使用inserted或deleted元表)执行更新.例如:
CREATE TRIGGER TR_Sample_U ON dbo.Sample FOR UPDATE -- AFTER is default so not needed
AS
IF EXISTS ( --check for disallowed modifications
SELECT *
FROM
Inserted I
INNER JOIN Deleted D
ON I.SampleID = D.SampleID
WHERE
I.Something <> D.Something
AND I.UpdateDate = D.UpdateDate
)
ROLLBACK TRAN;
Run Code Online (Sandbox Code Playgroud)
这些资源也可以帮助您: