[SQL] 점검 제한 조건 SQL 서버 2008 사용자 정의 기능
SQL점검 제한 조건 SQL 서버 2008 사용자 정의 기능
나는 SQL Server 2008에 작업 난이 기존 테이블, 장소 및 이벤트가 있습니다.
나는 이벤트 테이블의 event_expected_attendance 열에서 정수보다 항상 작거나 장소 테이블의 venue_max_capacity의 정수로 동일한 것을 확인하기 위해 점검 제한 조건이있는 사용자 정의 함수를 작성하려합니다.
점검 제한 조건은 두 테이블 사이이기 때문에 문을 가입으로 나뿐만 아니라 사용자 정의 함수의 구문을 고민하고있다.
도와 주셔서 감사합니다! 나는 빨리 추가 질문에 답합니다.
해결법
-
==============================
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.당신은이에 대한 스칼라 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)
네 개의 열을 포함하는 이유는 모든 필요한 값은 오류 메시지에 도시되도록한다.
from https://stackoverflow.com/questions/26693571/custom-function-with-check-constraint-sql-server-2008 by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 왜이 반환 자원 ID # 2를합니까? [복제] (0) | 2020.05.15 |
---|---|
[SQL] 액세스 2010 : 쿼리 식의 구문 오류 (누락 된 연산자) (0) | 2020.05.15 |
[SQL] 뷰에서 사용되는 별명의 실제 열 이름을 찾기? (0) | 2020.05.15 |
[SQL] MySQL의 : 내부 어디 대 가입 [중복] (0) | 2020.05.15 |
[SQL] SQL SELECT 첫 번째 N 양의 정수를 얻을 수 있습니다 (0) | 2020.05.15 |