在 SQL 脚本中使用 Shell 脚本变量

问题描述 投票:0回答:1

我有一个用于 PostgreSQL 数据库的初始化 sql 脚本。在脚本中,我希望使用存储在 shell 文件中的变量,而不是硬编码用户名。然而我却做不到。

这是 shell 文件:

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';

这是我运行管道时向我显示的错误:

sql postgresql bash shell variables
1个回答
0
投票

如果使用替换

:'user1'
,结果将作为字符串常量放在单引号中。但是
GRANT
要求角色是一个identifier,即对象名称。所以你必须不使用引号或使用双引号。

© www.soinside.com 2019 - 2024. All rights reserved.