Создать ФУНКЦИЮ в PostgreSQL из скрипта Bash - PullRequest
1 голос
/ 22 февраля 2011

Я пытаюсь создать FUNCTION в моей базе данных Postgres из скрипта Bash. К сожалению, я не могу заставить его работать. Это мой сценарий:

#!/bin/bash
# Save Postgres command to $POSTGRES_CMD
read -d '' POSTGRES_CMD <<"EOF"
CREATE OR REPLACE FUNCTION truncate_tables(username IN VARCHAR) RETURNS void AS $$
DECLARE
    statements CURSOR FOR
        SELECT tablename FROM pg_tables
        WHERE tableowner = username AND schemaname = 'public';
BEGIN
    FOR stmt IN statements LOOP
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ';';
    END LOOP;
END; 
$$
LANGUAGE plpgsql;
EOF

sudo su - postgres -c "psql -d postgres -U postgres -c \"${POSTGRES_CMD}\""

Когда я запускаю скрипт, я получаю следующую ошибку:

ERROR:  Syntax error at »20541«
LINE 1: ...N truncate_tables(username IN VARCHAR) RETURNS void AS 20541

Так что, похоже, что-то не так с $$? Как я могу создать FUNCTION, как в моем скрипте в Postgres из скрипта Bash? Должен ли я что-нибудь маскировать?


Edit:

Последний рабочий скрипт (также добавлен язык создания, если он еще не зарегистрирован):

#!/bin/bash
sudo su - postgres -c "psql -d postgres -U postgres" << 'EOF'
CREATE LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION truncate_tables(username IN VARCHAR) RETURNS void AS $$
DECLARE
    statements CURSOR FOR
        SELECT tablename FROM pg_tables
        WHERE tableowner = 'username' AND schemaname = 'public';
BEGIN
    FOR stmt IN statements LOOP
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ';';
    END LOOP;
END;
$$
LANGUAGE plpgsql;

Ответы [ 2 ]

6 голосов
/ 22 февраля 2011

$$ заменяется идентификатором процесса, вы должны избегать $$, например, \ $ \ $ или даже \\ $ \\ $, поскольку он экранируется два раза

4 голосов
/ 22 февраля 2011

Используйте << 'EOF', чтобы остановить bash-интерполяцию документа здесь. </p>

добавление :

Вы можете избежать передачи всего через "-c", используя:

sudo su - postgres -c "psql -d postgres -U postgres" <<'EOF'
...
EOF

, поскольку stdin должен сохраняться через sudo и su

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...