복붙노트

[SQL] 점검 제한 조건 SQL 서버 2008 사용자 정의 기능

SQL

점검 제한 조건 SQL 서버 2008 사용자 정의 기능

나는 SQL Server 2008에 작업 난이 기존 테이블, 장소 및 이벤트가 있습니다.

나는 이벤트 테이블의 event_expected_attendance 열에서 정수보다 항상 작거나 장소 테이블의 venue_max_capacity의 정수로 동일한 것을 확인하기 위해 점검 제한 조건이있는 사용자 정의 함수를 작성하려합니다.

점검 제한 조건은 두 테이블 사이이기 때문에 문을 가입으로 나뿐만 아니라 사용자 정의 함수의 구문을 고민하고있다.

도와 주셔서 감사합니다! 나는 빨리 추가 질문에 답합니다.

해결법

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

    1.사용 마틴 스미스가 언급 한 바와 같이 UDF와 점검 제한 조건은 몇 가지 문제를 가지고 있으며, 성능에 부정적인 영향을 미칠 수도 있지만, 어쨌든 그것을 시도하려는 경우이 코드는 작동합니다 :

    사용 마틴 스미스가 언급 한 바와 같이 UDF와 점검 제한 조건은 몇 가지 문제를 가지고 있으며, 성능에 부정적인 영향을 미칠 수도 있지만, 어쨌든 그것을 시도하려는 경우이 코드는 작동합니다 :

    CREATE FUNCTION dbo.CheckVenueCapacity (@venue_id int, @capacity int)
    RETURNS int
    AS 
    BEGIN
      DECLARE @retval int
        SELECT @retval = CASE WHEN venue_max_capacity >= @capacity THEN 0 ELSE 1 END
        FROM venues
        WHERE venue_id = @venue_id 
      RETURN @retval
    END;
    GO
    
    ALTER TABLE events 
      ADD CONSTRAINT chkVenueCapacity 
      CHECK (dbo.CheckVenueCapacity(event_venue_id, event_expected_attendance) = 0); 
    
  2. ==============================

    2.당신은이에 대한 스칼라 UDF를 사용할 수 있지만, 점검 제한 조건에있는 사람들은 잘 예를 들어,이 CHECK 제약에 싸여 스칼라 UDF를 참조 (문제를 문서화 사용하는 매우 느리고 다중 행 업데이트 또는 스냅 샷 격리를 위해 실패 할 수 있습니다 무결성에 대한 위협 시리즈?.

    당신은이에 대한 스칼라 UDF를 사용할 수 있지만, 점검 제한 조건에있는 사람들은 잘 예를 들어,이 CHECK 제약에 싸여 스칼라 UDF를 참조 (문제를 문서화 사용하는 매우 느리고 다중 행 업데이트 또는 스냅 샷 격리를 위해 실패 할 수 있습니다 무결성에 대한 위협 시리즈?.

    인덱싱 된 뷰에 이것을 적용 할 데이터베이스 엔진을 얻을 수도 있습니다

    열팽창 계수 및 UNION이 인덱싱 된 뷰에서 허용하지 않는 한이 두 행 도우미 테이블을 필요로한다. 아이디어는 뷰 정의는 항상 0 행을 반환해야하며,이 위반이있는 경우 반환되는 행을 두 배로 것입니다. 따라서 뷰에 고유 제한 조건의 위반의 원인과 발생하는 오류와 실패 할 문을 유발.

    CREATE TABLE dbo.TwoNums
      (
         Num INT PRIMARY KEY
      )
    
    INSERT INTO dbo.TwoNums
    VALUES      (1),
                (2) 
    

    뷰 정의 다음

    CREATE VIEW dbo.PreventOverCapacity
    WITH SCHEMABINDING
    AS
      SELECT V.Venueid,
             E.EventId,
             E.Expected,
             V.Capacity
      FROM   dbo.Venues V
             JOIN dbo.Events E
               ON E.venueid = V.venueid
                  AND E.Expected > V.Capacity
             CROSS JOIN dbo.TwoNums 
    

    그리고보기에 고유 인덱스

    CREATE UNIQUE CLUSTERED INDEX [UIX_PreventOverCapacity (Venueid, EventId, Expected, Capacity)]
      ON dbo.PreventOverCapacity(Venueid, EventId, Expected, Capacity) 
    

    네 개의 열을 포함하는 이유는 모든 필요한 값은 오류 메시지에 도시되도록한다.

  3. from https://stackoverflow.com/questions/26693571/custom-function-with-check-constraint-sql-server-2008 by cc-by-sa and MIT license