2013-10-16 3 views
0

테이블 중 하나에 제약 조건을 추가하려고하면 문제가 발생합니다. 나는 상태가 true가되도록 함수를 체크 인하 고 그것이 사실인지에 따라 1 또는 0을 반환하기를 원한다. 컬럼의 값이 NULL 그 오류를 점검 제한 조건 "chk_StateFinished"와 충돌IS NULL에 CHECK 제약 조건 충돌 추가

ALTER TABLE 문을 유발하지만 기능에 내가 확인. 데이터베이스 "databaseName", 테이블 "dbo.Participation"에서 충돌이 발생했습니다.

는 기능이

CREATE FUNCTION CheckStateFinished(@StudentID varchar(10), @CourseID varchar(10), @CoursePeriod varchar(10), 
         @SchoolYear int, @State varchar(15)) RETURNS int 
AS BEGIN 
    DECLARE @Grade varchar(1) 
    SELECT @Grade = Grade FROM Participation WHERE StudentID = @StudentID AND CourseID = @CourseID AND CoursePeriod = @CoursePeriod AND SchoolYear = @SchoolYear 
    RETURN CASE WHEN @State = 'Avslutad' AND @Grade = 'U' OR @Grade IS NULL THEN 0 
       ELSE 1 
    END 
END 

처럼 보인다 그리고 추가 점검 제한 조건은 다음과 같습니다

내가 대신 무엇을해야
ALTER TABLE Participation ADD CONSTRAINT chk_StateFinished CHECK (dbo.CheckStateFinished(StudentID, CourseID, CoursePeriod, SchoolYear, _State) = 1) 

는 기능에 null의 경우, 또는 내가 뭔가해야 그밖에?

답변

3

문제는 CheckStateFinished가 아니지만 CHECK CONSTRAINT가 추가 될 테이블 참여의 기존 데이터가 있습니다. 기본적으로 Alter table 명령을 사용하여 기존 테이블에 Check 제약 조건을 추가하면 기존 데이터와 새 데이터 모두에 적용됩니다. 주어진 StudentID, CourseID, CoursePeriod, SchoolYear, _State 매개 변수 함수가 0으로 평가되므로 Check 제약 조건이 실패한 테이블 참여에 일부 행이있을 수 있습니다.

그런 경우 WITH CHECKCH 옵션을 사용하여 CHECK 제약 조건을 새 데이터에만 적용합니다.

create table Participation (Grade varchar(1),StudentID varchar(10), CourseID varchar(10), CoursePeriod varchar(10), SchoolYear int, [State] varchar(15)) 

    insert into Participation values ('A','Student1','Course1','CourseP1',2013,'Avslutad') 
-- for this row check constraint will work fine. 
    insert into Participation values ('U','Student2','Course1','CourseP1',2013,'Avslutad') -- for this row check constraint will fail. 
    insert into Participation values (NULL,'Student3','Course1','CourseP1',2013,'Avslutad') 
-- for this row check constraint will fail. 
    insert into Participation values ('U','Student4','Course1','CourseP1',2013,'XYZ') 
-- for this row check constraint will work fine. 
    --insert into Participation values ('A','Student5','Course1','CourseP1',2013,'XYZ') 
    Go 

CREATE FUNCTION CheckStateFinished(@StudentID varchar(10), @CourseID varchar(10), @CoursePeriod varchar(10), 
         @SchoolYear int, @State varchar(15)) RETURNS int 
AS BEGIN 
    DECLARE @Grade varchar(1) 
    SELECT @Grade = Grade FROM Participation WHERE StudentID = @StudentID AND CourseID = @CourseID AND CoursePeriod = @CoursePeriod AND SchoolYear = @SchoolYear 
    RETURN CASE WHEN @State = 'Avslutad' AND @Grade = 'U' OR @Grade IS NULL THEN 0 
       ELSE 1 
    END 
END 

Go     

ALTER TABLE Participation WITH NOCHECK -- add this and your constraint will work. 
ADD CONSTRAINT chk_StateFinished CHECK (dbo.CheckStateFinished('Student3','Course1','CourseP1',2013,'Avslutad') = 1) 

Go 
+0

감사합니다. 항상보기 싫은 간단한 것들. – ccb3