0
たとえば、特定の行を持つ表があるとします。条件を満たす条件に基づいて特定の行を更新できないようにしますが、条件はfalseです。トリガーを使用して条件に基づいて特定の行をロックする
UPDATE [tbl_TriggerTest] SET [Value] = [Value] + 'M'
トランザクション:
が1だった場合、私は次のように実行するために、トランザクション全体SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbl_TriggerTest] (
[ID] [int] IDENTITY(1,1) NOT NULL,
[Value] [varchar](25) NULL,
[Date] [datetime] NULL,
CONSTRAINT [PK_tbl_TriggerTest] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
SET IDENTITY_INSERT [dbo].[tbl_TriggerTest] ON
GO
INSERT [dbo].[tbl_TriggerTest] ([ID], [Value], [Date]) VALUES (1, N'12', CAST(0x0000979A00000000 AS DateTime))
GO
INSERT [dbo].[tbl_TriggerTest] ([ID], [Value], [Date]) VALUES (2, N'13', CAST(0x00009A7500000000 AS DateTime))
GO
INSERT [dbo].[tbl_TriggerTest] ([ID], [Value], [Date]) VALUES (3, N'14', CAST(0x00009BE200000000 AS DateTime))
GO
INSERT [dbo].[tbl_TriggerTest] ([ID], [Value], [Date]) VALUES (4, N'4', CAST(0x00009D4F00000000 AS DateTime))
GO
SET IDENTITY_INSERT [dbo].[tbl_TriggerTest] OFF
GO
CREATE TRIGGER [dbo].[LockOldWelshRows] ON [dbo].[tbl_TriggerTest]
FOR UPDATE
AS
BEGIN
DECLARE @Count INT
SELECT @Count = COUNT([ID])
FROM INSERTED
WHERE [Date] < CONVERT(DATETIME, '01/04/2007 00:00:00', 103)
IF @Count > 0
BEGIN
RAISERROR('Rows prior to 01/04/2007 are locked',16,1)
ROLLBACK TRANSACTION
RETURN ;
END
END
GO
を中止することにより、2007年1月4日に、すべての行を前に「ロック」この例を取りますエラーが発生して失敗する:
Msg 50000, Level 16, State 1, Procedure LockOldWelshRows, Line 12
Rows prior to 01/04/2007 are locked
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.
このトリガを変更してトランザクションを許可する方法はありますかnはコミットしますが、日付が> 1/4/2007の場合のみ
これは非常に簡単な例です(私が扱っている表ははるかに複雑です)。正直なところ、私はそれがもっときれいだと思いますトランザクション全体が失敗した場合、どうすればいいのか不思議に思っていました。
パーフェクト、乾杯 – HeavenCore
+1 "の代わりに" – Pankaj