我有一个用于 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';
这是我运行管道时向我显示的错误:
如果使用替换
:'user1'
,结果将作为字符串常量放在单引号中。但是GRANT
要求角色是一个identifier,即对象名称。所以你必须不使用引号或使用双引号。