PostgreSQL : 뷰에서 열 삭제


10

VIEW진화 스크립트를 만들려고 하는 곳이 있으므로 열을 추가 할 수 있습니다. 그 부분은 잘 작동합니다. 열이 잘 추가되었습니다. 그러나 반대로 작동하지 않습니다. 마지막으로 추가 한 열을 제거하면 ERROR: cannot drop columns from view메시지 가 표시되지 않습니다 . 문제는이 특정보기에는 여러 가지 참조가 있다는 DROP CASCADE것입니다. 따라서 나는 굳이 할 수는 없습니다 !

주어진 항목에서 새로 추가 된 열을 제거 할 수없는 이유가 VIEW있습니까? 그런 다음이 작업을 수행하기 위해 어떻게해야합니까?

(참고 : 여기의 상황은 상황이지만, 많은 경우에보기에서 열을 삭제하는 것과 유사한 상황을 잘 볼 수 있습니다.)


처음에 열을 어떻게 추가 했습니까? 당신은 할 수 없습니다 ALTER VIEW ... ADD COLUMN. 사용하고 CREATE OR REPLACE VIEW있습니까? 코드보여 주세요.
Craig Ringer

@CraigRinger, 예, CREATE OR REPLACE VIEW추가 열을 제외하고 동일한 def로 (참조 테이블에 새 열이 추가되었으므로 뷰에 포함해야 함). (가) 그래서 "이양"는 ref'ed 테이블에서 열을 제거 VIEW도해야 하지 더 이상 돌아갑니다.
Yanick Rochon

답변:


13

PostgreSQL (최소 9.4 이상)은 현재로 열 제거를 지원하지 않습니다 CREATE OR REPLACE VIEW.

새 쿼리는 기존 뷰 쿼리에서 생성 된 것과 동일한 열 (즉, 동일한 순서 및 동일한 데이터 유형의 동일한 열 이름)을 생성해야하지만 목록 끝에 추가 열을 추가 할 수 있습니다.

열 삭제 지원을 추가 할 수없는 근본적인 이유는 없지만 아직 구현에 필요한 작업을 수행 한 사람은 없습니다.

CREATE OR REPLACE VIEW모든 종속성을 재귀 적으로 스캔하고 삭제할 열을 참조하지 않았는지 확인하십시오. 그들이 사용한다면 의존성 SELECT *확장에서 열을 제거해야 하고 의존성도 *스캔 해야 합니다. 이를 수행하는 데 약간의 작업이 있으며, 덤프 및 다시로드와의 상호 작용과 관련하여 열을 정확하게 삭제하는 방법이 명확하지 않은 영역이 있습니다. 따라서 아무도 아직 구현할 수있는 기능을 원치 않았습니다. 패치 및 / 또는 개발 후원은 환영합니다.

뷰와 뷰에 의존하는 모든 것을 삭제 한 다음 뷰와 그 의존성을 다시 만들어야합니다. ( 뷰에 열을 추가 할 때도 마찬가지였습니다 . 열 추가 지원은 8.4에 도입되었습니다).

일반적으로 DDL이 가역적이라는 기대는 없습니다. "혁명"의 개념은 실제로 결함이 있습니다. 예를 들어 열을 삭제 한 다음 다시 추가하면 데이터가 여전히 사라집니다.


2
그래서 복잡한 관계를 가진 대규모 응용 프로그램에서 열을 변경해야 할 때마다 전체 (또는 적어도 대부분의) DDL을 다시 만들어야한다고 말하는 것입니까? postgre에 대한 경험이 많지 않지만 mySQL에서 왔을 때 (Oracle, SQL Server 또는 MySQL의 경우) 그런 문제가 없었으며 변경 사항을 간단하게 수행 할 수 없으며 오류가있는 경우 이상하게 보입니다 ( 대신) 실행 시간에 던져집니다. 이 제한은 상당히 제한적입니다.
Yanick Rochon

@ YanickRochon Yep, 그것은 고통스럽고, 나는 그것이 개선 된 것을보고 싶습니다. 그러한 일을 돕고 자한다면 자금 조달 작업을 고려하십시오. postgresql.org/support/professional_support를 참조하십시오 .
Craig Ringer

우리는 그러한 기업에 자금을 지원하기에는 너무 작습니다. 그러나 그것이 고정 된 주제가 아니라는 것을 알게되어 기쁩니다.
Yanick Rochon

1
@YanickRochon 박람회 충분합니다. TODO- "기본 테이블이 변경 될 때보기 / 규칙 재 컴파일 허용", wiki.postgresql.org/wiki/Todo#Views_and_Rules에 있습니다.
Craig Ringer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.