У меня есть сценарий инициализации sql для базы данных PostgreSQL. В сценарии вместо жесткого кодирования имени пользователя я хочу использовать переменную, хранящуюся в моем файле оболочки. Однако я не могу этого сделать.
это файл оболочки:
export
DB_HOST = "xxx"
DB_PORT = "xxx"
DB_USER = "xxx"
DB_NAME = "xxx"
psql -U $DB_USER -d $DB_NAME -v user1=$DB_USER -f initialize_postgres.sql
и я хочу использовать его в сценарии sql, который выглядит следующим образом:
GRANT
SELECT,
INSERT,
DELETE,
UPDATE ON ALL TABLES IN SCHEMA public TO :'user1';
GRANT USAGE,
SELECT ON ALL SEQUENCES IN SCHEMA public to :'user1';
CREATE FUNCTION save_property (IN prop varchar(50), IN val varchar(500)) RETURNS void AS $$
UPDATE properties SET "value"=val WHERE id=prop;
INSERT INTO properties (id, value)
SELECT prop, val
WHERE NOT EXISTS (SELECT 1 FROM properties WHERE id=prop);
$$ LANGUAGE sql;
GRANT EXECUTE ON FUNCTION public.save_property(varchar(50),varchar(500)) TO :'user1';
это ошибка, которая отображается мне при запуске конвейера:
Я получаю ту же ошибку, используя двойные кавычки вокруг моей переменной, как вы предложили:')
Если вы используете замену :'user1'
, результат будет в одинарных кавычках как строковая константа. Но GRANT
требует, чтобы роль была идентификатором, то есть именем объекта. Поэтому вместо этого вам придется использовать кавычки или двойные кавычки.
Я получаю ту же ошибку, не используя кавычки или двойные кавычки:') Ошибка: psql:helper_scripts/datenbank/initialize_postgres.sql:188: ОШИБКА: синтаксическая ошибка на ":" или рядом с ней. СТРОКА 5: ОБНОВЛЕНИЕ НА ВСЕХ ТАБЛИЦАХ В СХЕМЕ public. КОМУ :"пользователь1"; ^ psql:helper_scripts/datenbank/initialize_postgres.sql:191: ОШИБКА: синтаксическая ошибка на уровне ":" или около него. СТРОКА 2: ВЫБРАТЬ НА ВСЕХ ПОСЛЕДОВАТЕЛЬНОСТИ В СХЕМЕ public to:"user1"; ^
Ну, это работает здесь и везде. Возможно, вы делаете что-то отличное от того, что показываете. Например, ваш оператор export
испорчен и ничего не экспортирует (но это не вызывает такой ошибки). Ошибка означает, что переменная не установлена.
Ваш комментарий выглядит так, будто вы все еще используете кавычки вокруг переменной. Это должно быть :user1
, а не :'user1'
или :"user1"
, верно?
@PaulHodges Двойные кавычки подойдут. Сообщение об ошибке указывает, что переменная psql
не установлена.
Используйте двойные кавычки вокруг своих переменных:
psql -U "$DB_USER" -d "$DB_NAME" -v "user1=$DB_USER" -f initialize_postgres.sql
Посмотрите Сохраните результат mysql в переменной массива bash, есть примеры использования переменных в обоих случаях. (Возможно, вас заинтересует мойshell-connector.sh
.)