[SQL] 점검 제한 조건은 다른 테이블에 관련된 수 있습니까?
SQL점검 제한 조건은 다른 테이블에 관련된 수 있습니까?
하자 내가 하나 개의 테이블이 ProjectTimeSpan라는이 말 (단지 예를 들어, 내가하지 않은!) 열 STARTDATE 및 종료 날짜를 포함.
그리고 내가 SubProjectTimeSpan라는 다른 테이블의 startDate 및 종료 날짜 전화도 포함 된 열을 가지고, 나는 그것이 불가능 ProjectTimeSpan.EndDate에 ProjectTimeSpan.StartDate 값 "외부"에 STARTDATE 및 종료 날짜를 설정할 수 있습니다 점검 제한 조건을 설정하려는 경우
다른 테이블 값에 대해 알고 점검 제한 조건의 종류 ...
이게 가능해?
해결법
-
==============================
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.당신은 프로젝트 ID와 매개 변수로 날짜를 제공하는 검사를 수행하고 1 또는 0, 다음에 점검 제한 조건을 만들 반환하는 사용자 정의 함수를 만들 수 있습니다.
당신은 프로젝트 ID와 매개 변수로 날짜를 제공하는 검사를 수행하고 1 또는 0, 다음에 점검 제한 조건을 만들 반환하는 사용자 정의 함수를 만들 수 있습니다.
-
==============================
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.하위 프로젝트는 프로젝트 범위 밖에있을 수 없지만 프로젝트 범위가 너무 모든 하위 프로젝트의 이사 수 없기 때문에 당신은 부모와 자식 테이블에 제약 조건을 추가해야합니다.
하위 프로젝트는 프로젝트 범위 밖에있을 수 없지만 프로젝트 범위가 너무 모든 하위 프로젝트의 이사 수 없기 때문에 당신은 부모와 자식 테이블에 제약 조건을 추가해야합니다.
상황이 이런 종류의, 당신은 당신의 데이터가 모두 테이블에 여러 쿼리 후 유효한 상태에 있는지 확인하기 위해 거래와 상위 레벨 (웹 서비스, 응용 프로그램)의 제약 검사를 연기한다!
-
==============================
5.많은 답변이 표시 한대로 확실하게이 작업을 수행 할 수 있습니다. 그러나 SQL Server가 UDF를 사용 CHECK 제약에 문제가있는 것 알고 있어야합니다 :
많은 답변이 표시 한대로 확실하게이 작업을 수행 할 수 있습니다. 그러나 SQL Server가 UDF를 사용 CHECK 제약에 문제가있는 것 알고 있어야합니다 :
https://dba.stackexchange.com/questions/12779/how-are-my-sql-server-constraints-being-bypassed
from https://stackoverflow.com/questions/3880698/can-a-check-constraint-relate-to-another-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오라클 - 분할 다중 콤마 여러 행 Oracle 테이블의 값을 구분 (0) | 2020.04.11 |
---|---|
[SQL] 두 개의 열을 기준으로 열을 동적으로 변환 행에 MySQL의 쿼리 (0) | 2020.04.11 |
[SQL] 더 '에 의한 주문'이 지정되지 않은 경우, 어떤 순서로 쿼리는 레코드 집합에 대한 선택 하는가? (0) | 2020.04.11 |
[SQL] MySQL의 1,062 - 키에 대한 중복 항목을 '0' 'PRIMARY' (0) | 2020.04.11 |
[SQL] 큰 테이블에 오프셋 최적화 쿼리 (0) | 2020.04.11 |