From afacc9a7db74603a876a2a3011742f0310d54441 Mon Sep 17 00:00:00 2001 From: king Date: Fri, 29 May 2026 02:24:26 +0900 Subject: [PATCH] =?UTF-8?q?fix(expense-db):=20psql=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EA=B0=80=20DO=20=EB=B8=94=EB=A1=9D=20=EB=82=B4=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=B9=98=ED=99=98=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dollar-quoted ($$...$$) 안의 :'app_password' 는 psql 이 치환하지 않아 서버에서 syntax error 발생. DO 블록을 제거하고 \gexec 로 동적 SQL 생성. - CREATE ROLE: 미존재 시에만 - ALTER ROLE: 비밀번호 항상 동기화 --- scripts/sql/expense_db_init.sql | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/scripts/sql/expense_db_init.sql b/scripts/sql/expense_db_init.sql index 9d4007f..6ddfe7f 100644 --- a/scripts/sql/expense_db_init.sql +++ b/scripts/sql/expense_db_init.sql @@ -24,14 +24,16 @@ WHERE NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = 'expense_db') \gexec -- 앱 전용 로그인 역할 -DO $$ -BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'expense_app') THEN - EXECUTE format('CREATE ROLE expense_app LOGIN PASSWORD %L', :'app_password'); - ELSE - EXECUTE format('ALTER ROLE expense_app WITH LOGIN PASSWORD %L', :'app_password'); - END IF; -END$$; +-- psql 변수(:'app_password')는 dollar-quoted 블록 안에서 치환되지 않으므로 +-- DO 블록을 쓰지 않고 \gexec 로 동적 SQL 을 생성·실행한다. + +SELECT 'CREATE ROLE expense_app LOGIN PASSWORD ' || quote_literal(:'app_password') +WHERE NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'expense_app') +\gexec + +-- 항상 최신 비밀번호로 동기화 +SELECT 'ALTER ROLE expense_app WITH LOGIN PASSWORD ' || quote_literal(:'app_password') +\gexec GRANT CONNECT ON DATABASE expense_db TO expense_app;