fix(expense-db): psql 변수가 DO 블록 내에서 치환되지 않는 문제 수정

dollar-quoted ($$...$$) 안의 :'app_password' 는 psql 이 치환하지 않아
서버에서 syntax error 발생. DO 블록을 제거하고 \gexec 로 동적 SQL 생성.

- CREATE ROLE: 미존재 시에만
- ALTER ROLE: 비밀번호 항상 동기화
This commit is contained in:
2026-05-29 02:24:26 +09:00
parent 9c58b022e2
commit afacc9a7db
+10 -8
View File
@@ -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;