2012-03-17 4 views
0

내 응용 프로그램은 PostgreSQL 9.1 데이터베이스를 사용합니다. 우리는 베타 단계에 있으며 우리는 때때로 PostgreSQL 스키마에서 버그를 찾습니다. 우리는 설치하고 작동하는 설치 프로그램을 가지고 있지만, 이제 우리는 다음 릴리스를 할 때 업데이트해야 할 설치가있는 시점에 있습니다.데이터베이스 스키마 업데이트 스크립트가 PostgreSQL 9.1에서 작동하게하려면 어떻게해야합니까?

제가 스크립트를 사용하여 결정을 내리는 방법을 묻는 질문을 게시했습니다. 내가 한 대답은 DO 문을 사용하는 것이 었습니다. 이것은 훌륭하게 작동하지만 문제가 발생했습니다.

설치 한 마지막 버전을 추적하는 테이블을 데이터베이스에 추가했습니다. 내 스크립트는 다음과 같습니다.

DO $$$ 
BEGIN 
    IF NOT EXISTS (SELECT * FROM "CarSystem"."CarSystem_Versions" WHERE "VersionId" = 2) THEN 

     -- Schema update statements go here 

    END IF; 
END; 
$$$ LANGUAGE plpgSQL; 

대부분의 문은 CREATE 또는 DROP 문과 같은 간단한 문법입니다. 그러나이 다음 릴리스에서해야 할 일 중 하나는 저장된 함수에 코드 변경을 적용하는 것입니다. 이 함수는 plpgSQL에서도 작성됩니다. 이 스토어드 프로시져는 두 개의 (2) $$ 기호를 사용하기 때문에 위의 코드에서 3 개의 $$$ 기호를 사용했습니다. 이것은 중첩 된 plpgSQL을 다르게 보이게 만들고 달러 기호의 두 번째 세트가 첫 번째 .

그러나 PostgreSQL이 내 저장 프로 시저에서 DECLARE 문을 때리면 오류가 발생합니다. 함수의 텍스트가 따옴표로 묶이지 않습니다.

동사의 올바른 방법은 무엇입니까? 나는이 DO 블록 외부에 저장 프로 시저를 넣고 CREATE OR REPLACE statemnt을 사용하여이를 선언해야합니까? 아니면 조건 안에 코드를 유지할 수있는 방법이 있습니까?

토니

답변

2

시도 :

DO $outer$ 
BEGIN 
    IF NOT EXISTS (SELECT * FROM "CarSystem"."CarSystem_Versions" WHERE "VersionId" = 2) THEN 

     -- Schema update statements go here 

    END IF; 
END; 
$outer$ LANGUAGE plpgSQL; 

4.1.2.4. Dollar-quoted String Constants

+0

감사합니다! 나는 내일 그 기회를 줄 것이고, 내가 그것을 일하게 할 수 있는지 알 것이다. 내가 원하는만큼 소리가납니다. –

+0

그건 나를 위해 일했습니다! 다시 한 번 감사드립니다! –

관련 문제