Prz*_*jda 4 trigger sql-server sql-server-2014
当下表中的 Flag 值为 1 时,我需要触发器帮助以防止更新列 Flag 之外的任何列(可以更新):
CREATE TABLE Tmp (Id INT, Type INT, TranDate DATE, Flag INT)
INSERT INTO Tmp VALUES (1, 2, '2017-04-24', 0)
INSERT INTO Tmp VALUES (2, 4, '2017-04-27', 1)
Run Code Online (Sandbox Code Playgroud)
我已尝试使用以下代码,但无法正常工作。
CREATE TRIGGER [dbo].[Prevent_Update_Trigger]
ON [dbo].[Tmp]
FOR UPDATE
AS
SET NOCOUNT ON
IF EXISTS(SELECT NULL FROM dbo.Tmp t JOIN inserted i ON t.Id=i.Id AND t.Flag=1)
BEGIN
RAISERROR('You can not update when Flag value is 1', 16, 1)
ROLLBACK TRAN
SET NOCOUNT OFF
RETURN
END
SET NOCOUNT OFF
Run Code Online (Sandbox Code Playgroud)
CREATE TRIGGER dbo_Tmp_trg_AU
ON dbo.Tmp
AFTER UPDATE
AS
BEGIN
SET ROWCOUNT 0;
SET NOCOUNT ON;
IF EXISTS
(
SELECT NULL
FROM Deleted AS Del
WHERE
-- Originally, flag was 1
Del.Flag = 1
AND NOT EXISTS
(
-- Column(s) aside from Flag have changed
SELECT
Del.[Type],
Del.TranDate
INTERSECT
SELECT
Ins.[Type],
Ins.TranDate
FROM Inserted AS Ins
WHERE
-- Same Id
Ins.Id = Del.Id
)
)
BEGIN
RAISERROR ('You can not update when Flag value is 1', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END;
END;
Run Code Online (Sandbox Code Playgroud)
这假定该Id
列无法更新(例如,它是一个IDENTITY
列)。
归档时间: |
|
查看次数: |
16863 次 |
最近记录: |