2012-02-20 6 views
0

예를 들어, 특정 행이있는 테이블이 있고, 조건과 일치하는 조건에 따라 특정 행을 업데이트하지 못하도록하지만 모든 행에서 업데이트를 커밋 할 수있는 방법 조건은 거짓입니다.트리거를 사용하여 조건에 따라 특정 행 잠그기

UPDATE [tbl_TriggerTest] SET [Value] = [Value] + 'M' 

거래 :

은 하나라면 나는 다음과 같은 실행 전체 거래

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. 

transactio를 허용하도록이 트리거를 수정하는 방법이 있습니까? n은 커밋 할 때만 날짜가> 1/4/2007

이 예제는 매우 간단합니다 (내가 사용하고있는 테이블은 훨씬 더 복잡합니다). 솔직히 말해서 나는 더 깨끗하다고 ​​생각합니다 전체 거래가 실패하면 어떻게 할 수 있는지 궁금합니다.

답변

3

허용되는 행에만 BEFORE aka INSTEAD OF trigger 및 필터가 필요합니다.

테스트되지 않은 :

CREATE TRIGGER [dbo].[LockOldWelshRows] ON [dbo].[tbl_TriggerTest] 
    INSTEAD OF UPDATE 
AS 
    BEGIN 

     UPDATE 
     T 
     SET 
     T.SomeCol = I.SomeCol... 
     FROM 
     [dbo].[tbl_TriggerTest] T 
     JOIN 
     INSERTED I ON T.keycol = I.keycol 
     WHERE 
     T.[Date] >= '20070401'; 

    END 

GO 
+0

완벽한, 건배 – HeavenCore

+0

일 "대신" – Pankaj

관련 문제