문제

나는 isdeleted로 표시되지 않은 두 개의 이름을 삽입하지 않기 위해 테이블에 방아쇠를 쓰려고 노력하고 있습니다. 그러나 선택의 첫 번째 부분에는 삽입 된 부분이 포함되어 있으므로 상태는 항상 사실입니다. 키워드를 사용하면 삽입 전에 트리거가 실행되지만이 경우 삽입 된 행이 이미 테이블에 있습니다. 내가 틀렸습니까?

ALTER TRIGGER TriggerName
ON MyTable
FOR INSERT, UPDATE
AS
BEGIN 
    If exist (select [Name] From MyTable WHERE IsDeleted = 0 AND [Name] in (SELECT [Name] FROM INSERTED)
    BEGIN
    RAISERROR ('ERROR Description', 16, 1);
    Rollback;
    END  
END
도움이 되었습니까?

해결책

데이터가 변경된 후 실행의 경우, 당신이 추구하는 대신 대신에.

편집 : 다른 사람이 언급 한 바와 같이, 변경중인 데이터 대신 실행 대신 실행 대신 데이터가 유효하지 않은 경우 유효한 경우 데이터를 삽입해야합니다.

트리거 유형에 대한 훨씬 자세한 설명은이 질문을 읽으십시오.

SQL Server "삽입 후"트리거가 방금 삽입 된 행이 표시되지 않습니다.

다른 팁

이후와 동일합니다. 트리거하기 전에 "시뮬레이션"하려면, 경고 대신 사용하기 전에, 트리거하기 전에 올바르게 기대할 수있는 것이 아닙니다. 즉, 필요한 조치를 제공하지 않으면 삽입/업데이트 된 데이터를 분실/무시할 수 있습니다.

MSSQL에는 트리거 이전에 없습니다.

SQL Server의 경우 SQL 이후에 실행되는 경우.

에서:http://msdn.microsoft.com/en-us/library/ms189799.aspx

| 후에

후에 트리거 SQL 문에 지정된 모든 작업이 성공적으로 실행 된 경우에만 DML 트리거가 발사되도록 지정합니다. 모든 참조 캐스케이드 조치 및 제약 조건 검사 도이 트리거 화재 전에 성공해야합니다.

후에 기본값은 지정된 유일한 키워드입니다.

후에 트리거는보기에서 정의 할 수 없습니다.

나는 실제로 최근에 비슷한 문제를 겪었고 그것을 처리 할 수있는 멋진 방법을 찾았습니다. 하나의 ID에 대해 여러 행을 가질 수있는 테이블이 있었지만 그 중 하나만 기본으로 표시 될 수 있습니다.

SQL Server 2008에서는 다음과 같은 부분 고유 인덱스를 만들 수 있습니다.

create unique index IX on MyTable(name) where isDeleted = 0;

그러나 SQL Server 2005에서 약간 더 작업을 통해이를 달성 할 수 있습니다. 트릭은 삭제되지 않은 행만을 보여준 다음 고유 한 클러스터 인덱스를 작성하는 것입니다.

 create view MyTableNotDeleted_vw
 with schema_binding /* Must be schema bound to create an indexed view */
 as
 select name 
 from dbo.MyTable /* Have to use dbo. for schema bound views */
 where isDeleted = 0;

 GO

 create unique clustered index IX on MyTableNotDeleted_vw ( name );

이것은 아직 삭제되지 않은 행에 영향을 미치는 고유 한 제약 조건을 효과적으로 생성 할 것이며 아마도 사용자 정의 트리거보다 더 잘 수행 될 것입니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top