복붙노트

[SQL] 점검 제한 조건에 하위 쿼리

SQL

점검 제한 조건에 하위 쿼리

나는 SQL-Server 2008 R2의 설계 테이블이 있습니다.

I는 데이터가 삽입 될 때 다른 테이블에 대해 검사 될 필요가 있다는 테이블의 열을 갖는다.

ALTER TABLE Table1
        WITH CHECK ADD CONSTRAINT CK_Code
        CHECK (MyField in (Select Field From Table2))

이 원인 오류

나는 체크 제약 조건에 대한이 질문에 보았다 - 하위 쿼리는이 컨텍스트에서 허용되지 않습니다.

트리거를 사용하지 않고이를 달성하는 방법이 있습니까?

해결법

  1. ==============================

    1.참고, 당신이 정말로 원하는 것은 외래 키 제약 조건입니다. 그 다음, 쿼리를 포함하고 스칼라 값을 출력하는 기능을 쓸 수있는 체크로 "쿼리"를 얻을 점검 제한 조건에 해당 기능을 사용했다.

    참고, 당신이 정말로 원하는 것은 외래 키 제약 조건입니다. 그 다음, 쿼리를 포함하고 스칼라 값을 출력하는 기능을 쓸 수있는 체크로 "쿼리"를 얻을 점검 제한 조건에 해당 기능을 사용했다.

    CREATE FUNCTION myFunction (
        @field DATATYPE(?)
    )
    RETURNS VARCHAR(5)
    AS
    BEGIN
        IF EXISTS (SELECT* FROM Table2 WHERE MYFIELD = @field)
            return 'True'
        return 'False'
    END
    

    뭐 그런. 검증되지 않은.

    그런 다음과 같이 수표에 추가 할 수 있습니다

    ALTER TABLE Table1
        WITH CHECK ADD CONSTRAINT CK_Code
        CHECK (myFunction(MYFIELD) = 'True')
    
  2. ==============================

    2.당신은 점검 제한 조건 안에 서브 쿼리를 가질 수 없습니다. 당신이 할 수있는 것은 UDF를 사용하다 반환하는 점검 제한 조건 내 스칼라 값.

    당신은 점검 제한 조건 안에 서브 쿼리를 가질 수 없습니다. 당신이 할 수있는 것은 UDF를 사용하다 반환하는 점검 제한 조건 내 스칼라 값.

    1 단계 : 테이블 만들기

    USE CTBX
    GO
    
    CREATE TABLE RawMaterialByGender 
    (
    RMGID int primary key identity(1,1),
    RMID smallint foreign key references RawMaterialMaster(RMID),
    LeveLMasterID smallint foreign key references LevelMaster(LevelTextID),
    IsDeleted bit
    )
    

    2 단계 : 스칼라를 반환하는 UDF를 작성

    Create FUNCTION [dbo].[IsValidLevelMasterGender](@LevelMasterID smallint)
    
        RETURNS bit
        AS
        BEGIN
         DECLARE @count smallint;
         DECLARE @return bit;
    
         SELECT @count = count(LevelTextID)      
         FROM [LevelMaster]
         WHERE LevelCategoryID = 3 AND IsActive = 1 AND LevelTextID=@LevelMasterID
    
         IF(@count = 0)
         SET @return = 'false';
         ELSE
         SET @return = 'true';
    
         RETURN @return;
    
        END;
        GO
    

    3 단계 : 알터 테이블은 CHECK 제약 조건을 추가하는

    ALTER TABLE RawMaterialByGender 
    ADD CONSTRAINT check_LevelMasterID CHECK (dbo.IsValidLevelMasterGender(LeveLMasterID) = 'true')
    
  3. ==============================

    3.

    ALTER TABLE Table1
    ADD CONSTRAINT FK_Table1_Code FOREIGN KEY (MyField)
    REFERENCES Table2 (Field) ;
    

    참조 : http://msdn.microsoft.com/en-us/library/ms190273.aspx 참고 : 나는 구문 위를 확인하지 않았습니다.

  4. ==============================

    4.먼저 귀하의 예제에서 모든 당신은 명확 FK 제약 조건이 필요합니다.

    먼저 귀하의 예제에서 모든 당신은 명확 FK 제약 조건이 필요합니다.

    또 다른있는 posibility은 CHECK OPTION을 함께보기를 사용하고 그것을 통해 사용자에게 액세스 권한을 부여하는 것입니다 :

    CREATE TABLE Table1(i INT PRIMARY KEY, CK_Code CHAR(1));
    CREATE TABLE Table2(Field CHAR(1));
    INSERT INTO Table2(Field) VALUES ('A'),('B'), ('C');
    GO
    
    CREATE VIEW v_Table1
    AS
    SELECT *
    FROM Table1
    WHERE CK_code IN (SELECT Field FROM Table2)  -- here goes your subquery check
    WITH CHECK OPTION;
    

    당신처럼 "제약 조건"을 위반하는 데이터를 삽입하려고하면

    INSERT INTO v_Table1(i, CK_Code)
    VALUES(10, 'D');
    

    당신은 얻을 것이다 :

    LiveDemo

  5. from https://stackoverflow.com/questions/13000698/sub-queries-in-check-constraint by cc-by-sa and MIT license