[oracle] Oracle 테이블 / 열 / 인덱스 이름이 30 자로 제한되는 이유는 무엇입니까?

몇 년 전에 이런 종류의 한계가있을 것이지만 요즘에는이 한계를 쉽게 높일 수 있습니다. 우리는 객체에 대한 명명 규칙을 가지고 있지만, 특히 외래 키의 이름을 지정할 때이 한계에 도달하는 경우가 항상 있습니다.

왜 이것이 이것이 더 큰 크기가 아닌지 또는 11g에서 더 큰지 알고 있습니까?


분명히 대답은 방어 적으로 코딩되지 않은 현재 스크립트를 중단한다는 것입니다. 나는 이것이 매우 걱정스러운 일이라고 말합니다. 오라클은 데이터베이스 가 되려고 노력하고 있습니다 . 확실히 이것은 반드시 개선 해야하는 종류입니다. 그렇지 않으면 제품이 수천 컷으로 죽을 것입니다.

사내에서 이런 종류의 이의를 볼 때마다 총알을 물고 정리해야 할 때라고 생각합니다. 사람들이 Oracle 버전을 업그레이드 할 때 확인하거나 유지 관리하지 않는 스크립트를 실행하는 경우 해당 결과로 인해 결과를 겪게합니다. 호환성 플래그를 제공하고 크기를 4000으로 늘린 다음 이름을 확인하기 위해 끊임없이 30으로 계산 해야하는 객체를 만들 때 낭비되는 시간을 절약하십시오.



답변

나는 그것이 ANSI 표준이라고 생각합니다.

편집하다:

실제로 SQL-92 표준이라고 생각합니다.

이후 버전의 표준은 선택적으로 128 개의 문자 이름을 허용하는 것으로 보이지만 Oracle은 아직이 문자를 지원하지 않습니다 (또는 30자를 허용하는 한 부분적으로 지원합니다).

이 페이지에서 “F391, 긴 식별자”를 검색하십시오 … http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/ap_standard_sql001.htm

(심판을 찾고)


답변

SQL 표준에서 파생되었다는 cagcowboy의 관점 외에도 (역사적으로, Oracle이 SQL의 표준화를 앞당기 고 나서 오라클의 결정이 SQL 표준으로 이어질 것이라고 생각합니다.) 더 긴 식별자를 허용하지 않으려는 많은 부분이 식별자가 30 자라고 가정하는 수백만 개의 사용자 지정 스크립트가있는 수백만 개의 DBA가 있다는 사실을 인식합니다. 다음과 같은 코드 행을 모두 허용

  l_table_name VARCHAR2(30);
BEGIN
  SELECT table_name
    INTO l_table_name
    FROM dba_tables
   WHERE ...

15 년 전에 DBA DBA_TABLES.TABLE_NAME%TYPE가 스크립트 대신 VARCHAR2 (30)를 사용했기 때문에 갑자기 깨 졌습니다. 오라클 만이 다양한 패키지와 구성 요소에서 수년에 걸쳐 이러한 종류의 작업을 수행 한 수천 곳의 장소에 베팅하고 싶습니다. 모두를 개조하는 것은 더 이상 식별자를 지원하기 위해 기존 코드를 거의 확실하게 생성 할 엄청난 프로젝트가 될 것이라고 방법 은 이익을 생성하는 것보다 더 많은 개발 시간 비용, QA 시간, 새로 도입 된 버그.


답변

나는 이것을 찾고 Google을 통해이 질문을 찾았지만 Oracle 12c Release 2 (12.2)부터는 더 이상 엄격하게 적용되지 않는다는 것을 알았습니다. ( https://oracle-base.com/articles/12c/long-identifiers-12cr2 )

어느 시점에서 모든 DBA 또는 개발자는 오브젝트 이름의 30 자 제한으로 인해 문제점이 발생하는 지점에 도달했습니다. 이 제한은 SQL Server 또는 MySQL에서 Oracle로 마이그레이션 프로젝트를 수행 할 때 매우 고통 스러울 수 있습니다. Oracle Database 12cR2에서 대부분의 식별자의 최대 길이는 이제 128 자입니다.

( http://blog.dbi-services.com/oracle-12cr2-long-identifiers/ ) 에 따르면 12.2의 새로운 기능입니다 . 그 게시물에 따르면 12.1은 여전히 ​​30 자로 제한되어있었습니다.


편집 : 변경 사항을 설명하는 공식 Oracle 문서에 대한 링크가 있습니다. ( https://docs.oracle.com/cloud/latest/exadataexpress-cloud/CSDBF/longer-identifier-names.htm#CSDBF-GUID-F4CA155F-5A37-4705-8443-0A8C9E3F875C )

Oracle Database 12c Release 2 (12.2)부터는 대부분의 데이터베이스 객체 유형에 대한 식별자 이름의 최대 길이가 128 바이트로 늘어났습니다.


답변

식별자 길이 제한의 실제 필요성을 감안할 때, 좋은 디자인은 이름이 서로 접두어 및 접미사로 결합 될 때 실제 이름의 길이를 제한하여 상한선에 닿지 않도록합니다.

예를 들어 외래 키 제약 조건의 명명 규칙

FK_<table1>_<table2> 

테이블 이름을 13 자 이하로 제한합니다. 대부분의 데이터베이스에는 더 많은 접두사와 접미사가 필요하므로 테이블 이름의 길이가 더 제한됩니다.


답변

제한 조건 위반은 255 자로 제한되며 대부분의 클라이언트가 오류를 표시하기 위해 사용하는 SQLERRM으로보고됩니다. 허용 가능한 제약 조건 이름의 크기를 늘리면 위반에 대해보고하는 기능 (특히 PL / SQL 코드의 여러 계층을 통해 제약 조건 위반이 발생한 경우)에 큰 영향을 줄 것으로 생각됩니다.


답변

30 자 식별자 길이는 1950 년대 후반에 표준화 된 COBOL에서 온 것으로 생각합니다. COBOL 프로그램은 SQL의 주 사용자 (및 그 이전의 SEQUEL (및 그 이전의 QUEL))이므로 ID 길이에 대한 적절한 숫자처럼 보였어 야합니다.


답변

이러한 ‘제약’은 모두 70 년대의 프로세서 아키텍처에 의해 부과 된 제한 사항에 대한 응답보다 남았습니다. 그 이후로 프로세서는 이러한 제한이 더 이상 필요하지 않은 수준으로 발전했습니다. 그들은 그냥 남았습니다. 그러나 그것들을 바꾸는 것은 RDBMS의 작가들에게 큰 거래입니다. 이러한 길이 제한은 모든 다운 스트림 변경에 영향을 미치므로 더 긴 프로 시저 이름이 더 긴 프로 시저 이름으로 인해 예외보고, 데이터 사전 등과 같은 다른 많은 것들을 깰 수 있다고 말할 수는 없습니다. Oracle RDBMS를 크게 다시 작성해야합니다.