복붙노트

[SQL] 왜 DBMS의 지원 주장을 할

SQL

왜 DBMS의 지원 주장을 할

나는 그래서 최근에 물론 내 데이터베이스의 ASSERTION에 대해 배웠고, 나의 교수는 주요 데이터베이스는 SQL-92 표준에 경우에도이를 지원하지 않는 것을 지적했다. 나는 이유를 찾기 위해 인터넷 검색을 시도하지만, 주제에 대한 토론이있을 것 같지 않습니다.

그럼, 왜 주장은 관계형 데이터베이스 패키지의 대다수에 의해 지원됩니다? 이 성능 문제를 용도로만 또는 뭔가 그것에 대해 본질적으로 어려운가요?

당신은뿐만 아니라 그것을 구현하는 데이터베이스 패키지 유의하시기 바랍니다 할 수있는 경우 (예 : DB 교육 / 학술있을 경우). 또한, 왜이 문제에 너무 작은 토론이있다; 심지어 SQL이나 SQL-92에 대한 위키 백과 페이지에서 언급) 그러나 의견의 주요 첫번째 질문하거나 대답을 대답 아니에요.

나는 트리거 또는 다른 어떤 그것을 구현하는 방법을 찾는 게 아니에요.

해결법

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

    1.열 수준, 행 수준, 테이블 수준 및 스키마 레벨 : 제약의 네 가지 단계가 있습니다.

    열 수준, 행 수준, 테이블 수준 및 스키마 레벨 : 제약의 네 가지 단계가 있습니다.

    테이블 레벨은, 예를 들어,이 소스 테이블이 변경 될 때 확인됩니다 만 선언되었지만 된 소스 테이블이 아닌 다른 목표 테이블을 포함 할 수있다. 이론적으로 스키마 수준의 제약은 스키마에서 모든 테이블의 모든 변경 사항을 점검 할 것이지만, 실제로 최적화는보다 세분화 된 방식으로 변화를 감지 할 수있을 것입니다; 당신의 DBMS 스키마 수준의 제약 조건에 대한 지원이 있다면 결과적으로, 당신은 실제로 테이블 수준의 제약 조건에 대한 많은 사용을 찾을 것입니다.

    없음 현재 SQL 제품은 스키마 수준의 제약 조건 즉 주장을 CREATE 지원하지 않습니다. 이 12월에 의해 후 보지 않았다하지만 더 이상 사건 때 분명히 RDB는이를 지원했다. - UPDATE : 사이베이스의 SQL의 어느 곳에서 지원하는 주장을 만드는 것이 개인 메시지에 나는 있지만, 이러한 제약은 때때로 위반 될 수 있도록 심각한 오류가있는 조언했다!

    유일한 SQL은 같은 제품 저는 현재 Access 데이터베이스 엔진 (어떤 ACE, 제트는)이며, 테이블 수준의 제약을 가능하게하는, CHECK 제약 조건에 하위 쿼리를 지원하는 사용했습니다. 그래도, 문제가 있습니다. 먼저, 연기 제약 체킹에 대한 SQL-92 기능 (또는 등가의) 미국가 지원되지 않는다. 둘째, 테이블 수준의 제약보다는 영향을받는 각 행에 대해 점검 할 때 SQL-92 표준에서 요구하는 문 완료. 물론이 해결 방법은 매우 투박 예입니다, 대답 제약 조건을 삭제하고 그렇게함으로써, 테이블을 잠글 업데이트를 실행, 제약 조건을 다시 작성하십시오. 틀림없이 달성 할 수있는 모든 것이 포함 테이블을 같은 제약 조건을 추가하여 스키마 수준의 제약은 거의 쓸모입니다.

    아마도 이러한 이유로, 액세스 팀은 제트 4.0의 초기 발표 (이 예를 들어, Access 도움말에서 누락 된 상태로 유지)을 넘어 모두에서의 CHECK 제약 조건 기능을 공개 적이 없다. 내 테이블 제약에 대해 말했다 모든 (예 : 유효한 상태 '역사'시간 테이블 시퀀스 키) 기능은 사용자가 액세스은 트리거와 같은 기능을 가지고 있음을 고려할 때 특히 잘 작동 (SQL을 기반으로하지,하지만) 마지막 년.

    물론 SQL은 UNIQUE 제약 물론 테이블 수준의하지만 이러한 특별한 경우 참조 무결성 제약 조건이있다. 따라서, 당신은 '야생'가 발생합니다 모든 제약 조건 중 하나 colum- 또는 행 수준 일 것이다.

    SQL DDL에서 CHECK ()를 사용하여 오류없이 구문 분석 있지만, 그것은 효과가 없습니다 것을 MySQL을로 인식 마십시오. 모두가 나를 넘어에서 사용자는 더 CHECK 제약 조건이있는 SQL 제품을 허용 할 수있는 방법! PostgreSQL은 우수한 제약 모델, 힌트 힌트가 있습니다 :

    그럼 왜 간 테이블 제약 때문에 rarelt 지원됩니까? 한 가지 이유는 역사적 상황으로 인해 수 있어야합니다. (제목 동시성 아래) @gbn 올바르게 식별은 SQL 구현의베이스 / SQL 서버 제품군은 간 테이블 제약 검사에 대처하지 영원히 변화 가능성이 뭔가 아니라 그 수있는 모델을 기반으로.

    당신은 오늘 SQL 제품을 만드는한다면 당신은 주장을 CREATE 포함됩니다 : 주변이에 다른 방법을 찾고 고려? 당신이 한 경우, 당신은 확실히 또한 (다중 할당은 틀림없이 더 나은 모델 임에도 불구하고) DEFERRABLE 제약 조건을 구현해야합니다. 하지만 당신은 당신이 '전통적인'최적화를 구축하는 길을 내려 가면 더 많은 연구와 경험을 그릴 수있을 것입니다. 그리고 아마 당신은 (MySQL은 ... CHECK 제약없이 어쨌든 얻을 수 있다면) PostgreSQL을 그것을하지 않는 경우에, 나는 누구도 생각하지 않는 스키마 수준의 제약 조건에 대한 상업적 수요가없는 찾을 것입니다.

    나는 진짜 쇼 스토퍼는 대부분의 업계 최강의 제품은 이미 임의의 복잡성 쓰기 '제약'에 사용자 수 (플러스 훨씬 더 예를 들어, 어떤 일이 알려 이메일을 보낼 수 있습니다) 트리거 기능을 개발했다라고 생각합니다. 물론, 그들은 코더 시스템이 진정한 제약의 관리를 수행하게 추가 작업을 많이 할 있으며, 성능은 정말 대단하지 경향, 절차보다는 선언적이다. 그러나 사실은 오늘날 실제 제품의 기존 및 공급 업체에 대한 '감옥 무료 카드의 나가'카드를 제공 할 것입니다. 왜 그들은 고객이 그들을 위해 테이블을 두드리는하지 않으면 가치 기능을 구현 귀찮게해야합니까?

    관련 학술 / 교육되는 언어의로서, @Damien_The_Unbeliever 올바르게 식별 등의 튜토리얼 D 제약은 따라서 정의에 의해 임의 conplexity의 글로벌 제약 있도록, 항상 'schema' 수준이다. 당신이 이런 종류의 기능과 함께 자신의 DBMS를 (!) 디자인을 찾고 있다면, 당신은 Dataphor이했던 것처럼, 스토리지에 대한 기존의 SQL DBMS를 사용하는 동안 D 사양을 구현하는 것을 고려해야한다.

    질문은 날 귀찮게되었습니다 기존의 '산업용 강도'SQL DBMS를 지원 트리거, 왜 그들은 단순히 선언적지도 내부적으로 트리거로 주장을 생성하지 않는 것이 주어진? 나는 그들이 그 성능이 그들의 기존 기술을 제공 소름이 끼치는 것 알고 있기 때문에 대답은 의심했습니다.

    더 만족 대답은 렉스 드 한, 툰 Koppelaars, 제 11 장 다중 튜플 제약 조건을 적용하는 트리거를 사용하는 경우 그들이 사용하는 다양한 실행 모델을 정의하여 데이터베이스 전문가를위한 응용 수학에 제공됩니다. 그들이 EM6을 부르는 (여전히 높은 드리겠습니다하지만) 가장 정교한 모델은 다음 단계를 포함한다 :

    그런 다음 주장 (웃기려는 의도가 없으며!)

    데이터베이스 제약 조건의 하나 개는 이러한 일반적인 클래스는 이미 널리 물론, 구현되는 외래 키입니다.

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

    2.제 2 페니 :

    제 2 페니 :

    편집 : CHECK 제약에 싸여 스칼라 UDF를 매우 느리게하고 다중 행 업데이트와 토니 Rogerson에에서 실패 할 수 있습니다 나는이 링크에 설명되어 무엇을 의미하는지

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

    3.(일반적으로하지라는 ASSERTION, 학술 간주 비-SQL) D (일명. 튜토리얼 D)는 데이터베이스에 대한 임의의 제약 조건이 될 수 제약이있다. 하나의 구현 REL이라고

    (일반적으로하지라는 ASSERTION, 학술 간주 비-SQL) D (일명. 튜토리얼 D)는 데이터베이스에 대한 임의의 제약 조건이 될 수 제약이있다. 하나의 구현 REL이라고

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

    4.오라클 10g의 일부 초보적인 지원이있다 :

    오라클 10g의 일부 초보적인 지원이있다 :

    http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_assert.htm

    나는 확신와 저장 프로 시저 지원 선박 다른 RDBMS 유사한 내장 불구하고, 어떤 SQL 표준의 일부가 아니다 분명히 절차 .... 이 표준은 지정 않습니다 :

    <assertion definition> ::=
              CREATE ASSERTION <constraint name> <assertion check>
              [ <constraint attributes> ]
    
    <assertion check> ::=
              CHECK <left paren> <search condition> <right paren>
    

    http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt의 장 11.34 참조

    나는이 주장하는 CREATE에 대해 확실하지 않다. 지금까지 어떤 RDBMS에서 발생하지 않은, 나는 많은 RDBMS가 실제로 구현 생각하지 않습니다. 다른 한편으로, 하나의 테이블 컬럼에 CHECK 절도 주장으로 간주 될 수있다.

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

    5.네, 몇 달 전에 클래스 내 강사에게이 질문을했다. 이 표준에있을 수 있지만, 많은 DBMS 벤더는 전혀하지 순종 표준을한다.

    네, 몇 달 전에 클래스 내 강사에게이 질문을했다. 이 표준에있을 수 있지만, 많은 DBMS 벤더는 전혀하지 순종 표준을한다.

    아마, 지원의 주장에하지에 DBMS의 뒤에 이유는 매우 비용이 많이 드는 작업입니다 아무도 이런 이유로 그것을 사용하려고하지 않습니다이다.

    편리한 방법을 제공하기 위해, DBMS의 트리거 및 검사를 구현했습니다. 이 방법에 의해, 아무도 실제로 주장을 필요로하지 않는다.

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

    6."당신은, 데이터베이스 패키지를 참고하시기 바랍니다 수 있다면 그뿐만 아니라 그것을 구현"

    "당신은, 데이터베이스 패키지를 참고하시기 바랍니다 수 있다면 그뿐만 아니라 그것을 구현"

    SIRA_PRISE 전체에서이 기능을 지원합니다. 공개 : 저는 저자입니다.

    (실제 질문에 대해서는 "왜하지 제공 업체를 DBMS이"당신은 정말 업체를 요청해야 싶지만, (a)는 진정한 관계형 시스템에서도 해결하기 매우 어려운 문제, (b)는 즉 복잡성은 심각하게, SQL데도 근처 진정한 관계 없으며, (c)는 대부분의 프로그래머가 자신이 트리거를 사용하여 선언적 주장과 동일한 효과를 달성 할 능력이 충분 생각하는 가능성이 매우 높다 사실에 의해 악화하고 이것을 순전히 이상에있다 개발 비용.)

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

    7.오라클은 12C 출시이 후 다음 버전에 대한 가능한 향상으로 이것을 고려하고, 툰 Koppelaars 5 월 (2016)에서이 포스트를 참조하십시오.

    오라클은 12C 출시이 후 다음 버전에 대한 가능한 향상으로 이것을 고려하고, 툰 Koppelaars 5 월 (2016)에서이 포스트를 참조하십시오.

    이 기능에 관심이 있다면, 나는 그것을 upvoting 좋습니다.

  8. from https://stackoverflow.com/questions/6368349/why-dont-dbmss-support-assertion by cc-by-sa and MIT license