복붙노트

[SQL] SQL Server의 지연 가능 제약

SQL

SQL Server의 지연 가능 제약

SQL Server의 버전, 연기 제약 (DC)를 지원합니까?

당신이 삽입 또는 개별 테이블을 갱신하지 않을 경우, 명령문 그룹을 커밋 경우에만 평가됩니다 제약 - 버전 8.0에 대한 때문에, 오라클, 연기 제약을 지원하고있다. 지연 가능 제약은 제약이 여전히 활성화되어있는 것을, 제약 조건을 활성화 / 비활성화 다를 - (배치가 최선을 다하고 경우) 그들은 단지 나중에 평가됩니다.

DC의 장점은 개별적으로 불법 것 업데이트 cummulatively 유효한 종료 상태가 발생할 것으로 평가 될 수 있다는 점이다. 각 행에 존재하는 값이 필요한 곳의 예는 두 개의 행 사이에서 순환 참조 표를 작성한다. 어떤 개별 삽입 문은 제약 조건을 통과하지 않을 것이다 - 그러나 그룹이 있습니다.

내 목표를 명확히하기 위해, 나는 포트의 SQLServer에 C 번호에 ORM 구현을 찾고 있어요 - 불행하게도 구현은 행 사이에 삽입 / 업데이트 / 삭제 명령을 계산 피하기 위해 오라클 DC에 의존한다.

해결법

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

    1.지금까지 SQL 서버가 필요합니다. 당신이 해결하는 문제는 무엇인가?

    지금까지 SQL 서버가 필요합니다. 당신이 해결하는 문제는 무엇인가?

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

    2.OT : 거기 SQL 서버가 지원하지 않는 꽤 몇 가지 이럴하지만 엔터프라이즈 환경에서 감각을 만들 것입니다 :

    OT : 거기 SQL 서버가 지원하지 않는 꽤 몇 가지 이럴하지만 엔터프라이즈 환경에서 감각을 만들 것입니다 :

    이 모든 작은 것들 당신은 SQL Server의 거의 쓸모없는 풀 사이즈 RDBMS에서 기대하는 참조 무결성의 많은 및 트랜잭션 기능을합니다. 이리저리 일부 오염의 해결 방법을 제외시켰다 - - 모든에서 참조 무결성 제약 조건을 정의하지에있는 연기 제약이 지원되지 않기 때문에 예를 들어, 직장의 외부 일관된 단위로 "거래"의 개념은 부분적으로 만 가능한 솔루션은 부정된다. 나는 트랜잭션의 자연적인 행동은 당신이하는 방식과 당신이 좋아하는 작업의 순서대로 내부에서 작업 할 수있는 일, 기대, 시스템은 확실히 당신이 그것을 커밋 시점에 일치 할 것이다. 비슷한 문제가 DELETE CASCADE ON와 참조 무결성 제약 조건은 단지 하나의 단일 제약 객체의 계단식 삭제로 이어질 수있는 방식으로 정의 될 수 있다는 제한에서 발생한다. 이건 정말 대부분의 실제 시나리오에 적합하지 않습니다.

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

    3.분명히 없습니다.

    분명히 없습니다.

    나는 지연 가능 제약 조건을 지원하지 않는 다섯 가지의 블로그 게시물 (다양한 버전의) 모든 말을 SQLServer에 대해 발견했다.

    반면에, 나는 또한 "계산 지속 열,"(마지막 항목으로 이동), 그러나주의의 위험 부담를 사용하여 포스트 모방이 기능에 대한 시도를 발견

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

    4.당신이 가지고있는 문제는 SQL 무엇 날짜 및 다웬 호출 '다중 할당'을 지원하지 않는다는 것입니다 것 같은데. 이 표준 SQL의 반응은 SQL Server가 지원하지 않는, '연기 제약'입니다. 는 SQL 서버 FK 또는 CHECK 제약 조건은 NOCHECK하지만 꽤 동일하지으로 플래그 할 수 있습니다. ALTER TABLE (Transact-SQL)를 참조하십시오 : 자세한 내용은 MSDN을 참조하십시오.

    당신이 가지고있는 문제는 SQL 무엇 날짜 및 다웬 호출 '다중 할당'을 지원하지 않는다는 것입니다 것 같은데. 이 표준 SQL의 반응은 SQL Server가 지원하지 않는, '연기 제약'입니다. 는 SQL 서버 FK 또는 CHECK 제약 조건은 NOCHECK하지만 꽤 동일하지으로 플래그 할 수 있습니다. ALTER TABLE (Transact-SQL)를 참조하십시오 : 자세한 내용은 MSDN을 참조하십시오.

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

    5.특정 조건에서 누락 된 이연 제약 집행 해결하려면 방법있다 (헤세이 2017 등이, SQL Server의 이연 제약에 대한 지원이 없다). 다음 데이터베이스 스키마를 고려하십시오

    특정 조건에서 누락 된 이연 제약 집행 해결하려면 방법있다 (헤세이 2017 등이, SQL Server의 이연 제약에 대한 지원이 없다). 다음 데이터베이스 스키마를 고려하십시오

    면책 조항 : 스키마의 품질 또는 사용의 경우, 여기에 논의를 위해 아니라,이 해결 방법에 대한 기본 예제로 제공됩니다

    CREATE TABLE T (Id TYPE NOT NULL PRIMARY KEY, NextId TYPE NOT NULL);
    
    ALTER TABLE T WITH CHECK ADD CONSTRAINT FK_T2T 
    FOREIGN KEY (NextId) REFERENCES T (Id);
    
    CREATE UNIQUE NONCLUSTERED INDEX UC_T ON T (NextId);
    

    어디 TYPE은 대리 키에 대한 몇 가지 적절한 데이터 유형입니다. 가정은 대리 키 값이 삽입 작업 (즉 IDENTITY) 중에 RDBMS가 할당된다는 것이다.

    사용 케이스 NextId = NULL로 엔티티 T의 "최신"버전을 유지하고, 단일 연결리스트 T.NextId을 유지하여 이전 버전을 저장하는 것입니다 -> T.Id.

    새로 만들기 - "최신"버전의 삽입의 업데이트를 선행해야하기 때문에 분명히, 주어진 스키마는 이연 제약 문제에 대한 주제 인 "최신"그 시간 동안 동일한 NextId와 데이터베이스에 두 개의 레코드가있을 것 old- 값.

    이제 경우 :

    기본 키의 데이터 타입은 숫자 일 필요는없고, 그래서 같은 후 지연 제약 문제 MERGE 문을 사용하여 회피했다되고, 미리 (즉, 고유 식별자)에서 계산 될 수있다 :

    DECLARE @MergeTable TABLE (Id UNIQUEIDENTIFIER);
    
    DECLARE @NewLatestVersion UNIQUEIDENTIFIER = NEWID();
    
    INSERT INTO @MergeTable (Id) VALUES (@NewLatestVersion);
    INSERT INTO @MergeTable (Id) VALUES (@OldLatestVersion);
    
    MERGE INTO T
    USING @MergeTable m ON T.Id = m.Id
    WHEN MATCHED THEN UPDATE SET T.NextId = @NewLatestVersion
    WHEN NOT MATCHED THEN INSERT (Id) VALUES (@NewLatestVersion);
    

    분명히, MERGE 문은 제약 조건을 확인하기 전에 모든 데이터 조작을 완료합니다.

  6. ==============================

    6.당신이 당신의 자신의 ORM 층이있는 경우, 귀하의 문제를 해결하는 한 가지 방법은 당신의 ORM 층의 논리에 의해 참조 업데이트에서 개체 업데이트를 분리 할 수 ​​있습니다. 당신의 ORM은 여러 단계의 클라이언트 측 변경 세트를 기반으로 트랜잭션 작업 것이다 :

    당신이 당신의 자신의 ORM 층이있는 경우, 귀하의 문제를 해결하는 한 가지 방법은 당신의 ORM 층의 논리에 의해 참조 업데이트에서 개체 업데이트를 분리 할 수 ​​있습니다. 당신의 ORM은 여러 단계의 클라이언트 측 변경 세트를 기반으로 트랜잭션 작업 것이다 :

    모든 객체는 외부 키 값이 세트입니다 언제든지 존재를 참조 때문에, 당신의 문제를 해결해야한다 ...

  7. ==============================

    7.이 방법을 사용할 수 있습니다

    이 방법을 사용할 수 있습니다

    ALTER TABLE your_table NOCHECK CONSTRAINT your_constraint
    

    액션

    ALTER TABLE your_table WITH CHECK CHECK CONSTRAINT ALL
    
  8. from https://stackoverflow.com/questions/998095/deferrable-constraints-in-sql-server by cc-by-sa and MIT license