복붙노트

[SQL] 점검 제한 조건은 다른 테이블에 관련된 수 있습니까?

SQL

점검 제한 조건은 다른 테이블에 관련된 수 있습니까?

하자 내가 하나 개의 테이블이 ProjectTimeSpan라는이 말 (단지 예를 들어, 내가하지 않은!) 열 STARTDATE 및 종료 날짜를 포함.

그리고 내가 SubProjectTimeSpan라는 다른 테이블의 startDate 및 종료 날짜 전화도 포함 된 열을 가지고, 나는 그것이 불가능 ProjectTimeSpan.EndDate에 ProjectTimeSpan.StartDate 값 "외부"에 STARTDATE 및 종료 날짜를 설정할 수 있습니다 점검 제한 조건을 설정하려는 경우

다른 테이블 값에 대해 알고 점검 제한 조건의 종류 ...

이게 가능해?

해결법

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

    1.GSerg의 대답에 귀하의 코멘트에 대한 응답으로, 여기에 기능을 사용하여 예를 점검 제한 조건입니다 :

    GSerg의 대답에 귀하의 코멘트에 대한 응답으로, 여기에 기능을 사용하여 예를 점검 제한 조건입니다 :

    alter table YourTable
    add constraint chk_CheckFunction
    check (dbo.CheckFunction() = 1)
    

    어디 같은 기능을 정의 할 수 있습니다 :

    create function dbo.CheckFunction()
    returns int
    as begin
        return (select 1)
    end
    

    함수는 다른 테이블을 참조 할 수있다.

  2. ==============================

    2.당신은 프로젝트 ID와 매개 변수로 날짜를 제공하는 검사를 수행하고 1 또는 0, 다음에 점검 제한 조건을 만들 반환하는 사용자 정의 함수를 만들 수 있습니다.

    당신은 프로젝트 ID와 매개 변수로 날짜를 제공하는 검사를 수행하고 1 또는 0, 다음에 점검 제한 조건을 만들 반환하는 사용자 정의 함수를 만들 수 있습니다.

  3. ==============================

    3.STARTDATE를 및 종료 날짜 열이 결합 된 ProjectTimeSpan 테이블의 키의 복합 키를 확인한 다음 SubProjectTimeSpan 테이블에 외래 키 참조를 위해이 복합 키를 사용합니다. 이렇게하면, 예를 들어 SubProjectTimeSpan 테이블에 필요한 행 수준 CHECK 제약 조건을 작성할 수있는 기능을 제공합니다

    STARTDATE를 및 종료 날짜 열이 결합 된 ProjectTimeSpan 테이블의 키의 복합 키를 확인한 다음 SubProjectTimeSpan 테이블에 외래 키 참조를 위해이 복합 키를 사용합니다. 이렇게하면, 예를 들어 SubProjectTimeSpan 테이블에 필요한 행 수준 CHECK 제약 조건을 작성할 수있는 기능을 제공합니다

    CREATE TABLE ProjectTimeSpan 
    (
     project_ID INTEGER NOT NULL UNIQUE, -- key
     StartDate DATE NOT NULL, 
     EndDate DATE NOT NULL, 
     CHECK (StartDate < EndDate), 
     UNIQUE (project_ID, StartDate, EndDate) -- compound key
     -- other project columns here...
    );
    
    CREATE TABLE SubProjectTimeSpan 
    (
     project_ID INTEGER NOT NULL, 
     StartDate DATE NOT NULL, 
     EndDate DATE NOT NULL, 
     FOREIGN KEY (project_ID, StartDate, EndDate)
        REFERENCES ProjectTimeSpan (project_ID, StartDate, EndDate)
        ON DELETE CASCADE
        ON UPDATE CASCADE, 
     sub_StartDate DATE NOT NULL, 
     sub_EndDate DATE NOT NULL, 
     CHECK (sub_StartDate < sub_EndDate),
     CHECK (StartDate <= sub_StartDate), -- sub project can't start before main project
     CHECK (sub_EndDate <= EndDate)      -- sub project can't end after main project
     -- other sub project columns here...
    );
    
  4. ==============================

    4.하위 프로젝트는 프로젝트 범위 밖에있을 수 없지만 프로젝트 범위가 너무 모든 하위 프로젝트의 이사 수 없기 때문에 당신은 부모와 자식 테이블에 제약 조건을 추가해야합니다.

    하위 프로젝트는 프로젝트 범위 밖에있을 수 없지만 프로젝트 범위가 너무 모든 하위 프로젝트의 이사 수 없기 때문에 당신은 부모와 자식 테이블에 제약 조건을 추가해야합니다.

    상황이 이런 종류의, 당신은 당신의 데이터가 모두 테이블에 여러 쿼리 후 유효한 상태에 있는지 확인하기 위해 거래와 상위 레벨 (웹 서비스, 응용 프로그램)의 제약 검사를 연기한다!

  5. ==============================

    5.많은 답변이 표시 한대로 확실하게이 작업을 수행 할 수 있습니다. 그러나 SQL Server가 UDF를 사용 CHECK 제약에 문제가있는 것 알고 있어야합니다 :

    많은 답변이 표시 한대로 확실하게이 작업을 수행 할 수 있습니다. 그러나 SQL Server가 UDF를 사용 CHECK 제약에 문제가있는 것 알고 있어야합니다 :

    https://dba.stackexchange.com/questions/12779/how-are-my-sql-server-constraints-being-bypassed

  6. from https://stackoverflow.com/questions/3880698/can-a-check-constraint-relate-to-another-table by cc-by-sa and MIT license