2013-05-23 3 views
0

트리거를 만들어 값이 특정 값을 초과하는 것을 방지하고 싶습니다.sql 트리거 - if 문 - 업데이트 금지

나는 조금 읽었지만 아래 질문을 내 자신과 관련시킬 수 없습니다.

Trigger to fire only if a condition is met in SQL Server

코드 :

ALTER TRIGGER Tgr_IQRating 
    ON dbo.Customer 
    FOR UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @IQ int 

    Select @IQ = IQRATING from dbo.customer 

    IF (@IQ) > 150 
    BEGIN 
     PRINT ('Cannot enter anything higher than 100') 
    END 

    ROLLBACK TRANSACTION 
END 

나는이

IF (IQRating) > 150 
BEGIN 
    PRINT ('Cannot enter anything higher than 100') 
END 

ROLLBACK TRANSACTION 

처럼 그것을 시도하지만 열을 찾을 수 없다는 오류가 발생했습니다. 또한 업데이트를 시도 할 때 아래 오류가 발생합니다.

IF (SELECT IQRating FROM dbo.customer) > 150 
BEGIN 
    PRINT ('Cannot enter anything higher than 100') 
END 

오류 :

Msg 512, Level 16, State 1, Procedure Tgr_IQRating, Line 16
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

어떤 도움도 좋은 것입니다.

감사합니다.

제이.

답변

0

"테이블"inserted을 사용하면 업데이트되는 데이터를 볼 수 있습니다. 그렇지 않으면 다른 행도 포함 할 전체 테이블을 볼 수 있습니다.

IF EXISTS(SELECT 1 FROM inserted WHERE IQRating > 150) 
BEGIN 
    PRINT ('Cannot enter anything higher than 150') 
END 

더 나은 솔루션 RAISERROR 또는 SQL Server 2012 THROW 문 대신 PRINT을 사용하는 것 때문에 오류 메시지가 다시 업데이트를 시작 누구에 전송된다.

+1

사실, 그 의사 테이블과'행이 삭제에 대한 Deleted' (또는 이전에 이전 valuse (INSERT' 또는'UPDATE''후) 새 값'Inserted' 호출되는' UPDATE'). SQL 서버에'updated' 의사 테이블이 없습니다 ... –

+1

와우, "업데이트 된"테이블을 어떻게 관리했는지 모르겠군요 ... 미안 해요! –

0

여러 가지 문제가 있습니다. 먼저 롤백이 IF 블록에 없으므로 100 %의 시간을 롤백합니다. 다음

Select @IQ = IQRATING from dbo.customer 

은 서브 쿼리 문제입니다. 고객이 여러 기록을 가지고 있다고 가정합니다! 그리고 어쨌든 대신 삽입 된 pseudotable을 참조해야합니다.

세 번째로 트리거는 한 번에 하나의 행에서만 작동한다고 생각하는 것 같습니다. 일괄 적으로 작동합니다. 이 점에 대한 단서는 스칼라 변수를 채우는 것입니다. 업데이트에 기록이 하나만있을 것이라고 가정하는 것은 무책임하고 전문가가 아닙니다.

또한 INSERT에서이 검사를 수행해야합니까? 또는이 데이터가 업데이트로 채워지는 것입니까?

하나의 레코드가 잘못되거나 모든 잘못된 레코드를 찾고 해당 데이터베이스 만 유지하려는 경우 전체 트랜잭션을 롤백하려는 경우 확실하지 않습니다. 각 가능성에 대한 코드는 다를 수 있습니다.

편집 일부는 SQL 서버용입니다 (나는 mysql 태그를 보지 못했지만 SQL 서버를 텍스트로 참조 했으므로 가정했습니다.) 코드는 T_SQL 코드처럼 보입니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. marc_s - 난 END 일 ('150 이상 아무 것도 입력 할 수 없습니다') PRINT를 BEGIN (IQRating가> 150 WHERE 업데이트에서 1을 선택) IF가 존재하는 사용. HLGEM - if 문에서 롤백을 지적 해 주셔서 감사합니다. 짐작 하시겠지만, 나는 SQL과 프로그래밍/스크립팅에 대해 매우 익숙하며 일반적으로 새로운 영역에 대해 관심을 가지고 있습니다. Micah Bright - 작업/코딩이 적어짐에 따라 구속 조건이 앞으로 나아갈 수있는 최선의 방법이라고 생각합니다. – Jay

1

정말 제약 조건을 사용해야합니다. 그것은 SQL보다 관용적입니다.

Check Constraint