sql - postgresql - 尝试将变量从命令行传递到 sql 脚本时出错

标签 sql postgresql psql postgresql-9.3

我如何将变量传递到这个 postgresql 代码中?我知道它适用于前两行和那些变量,但随后进入 DO 语句时出错..

我使用 :p5 作为我的参数。

CREATE ROLE :v3 LOGIN ENCRYPTED PASSWORD :p3 NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
ALTER ROLE :v3 SET search_path = foo_bar_dev_:v4;
DO
$body$
BEGIN
   IF NOT EXISTS (
      SELECT *
      FROM   pg_catalog.pg_user
      WHERE  usename = 'foo_readonly') THEN

      CREATE ROLE foo_readonly LOGIN PASSWORD :p5 ;
   END IF;
END
$body$

我收到此错误消息:

psql:Test.sql:18: ERROR:  syntax error at or near ":"
LINE 9:       CREATE ROLE foo_readonly LOGIN PASSWORD :p5 ;
                                                      ^

一旦它进入 DO 正文,我就会收到此错误。

我在 shell 脚本中这样调用它:

"$PSQL" -h $HOST_NM             \
        -p $PORT                \
        -U foo                  \
        -v v3=$USER             \
        -v p3="'$USER_PWD'"     \
        -v p4="'$1'"            \
        -v p5="'$READONLY_PWD'" \
        -a                      \
        -f Test.sql postgres | tee >> $LOG

还有其他方法吗?

最佳答案

密码应该在引号中:

CREATE ROLE :v3 LOGIN ENCRYPTED PASSWORD :p3 NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
ALTER ROLE :v3 SET search_path = foo_bar_dev_:v4;
DO
$body$
BEGIN
   IF NOT EXISTS (
      SELECT *
      FROM   pg_catalog.pg_user
      WHERE  usename = 'foo_readonly') THEN

      CREATE ROLE foo_readonly LOGIN PASSWORD ':p5' ;
   END IF;
END
$body$

关于sql - postgresql - 尝试将变量从命令行传递到 sql 脚本时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31129747/

相关文章:

mysql - 连接三个 MySQL 表并从一个表中获取最大值

database - 我在我的 mac 上设置了 psql 和 pgadmin。我可以在两者上创建数据库和表,但它们似乎没有连接

postgresql - 在 psql 中使用位置参数 ($1,..)

python - 从 Flask-SQLAlchemy 获取 UTC 格式的日期时间字段

go - 如何将 exec.Command 的输出通过管道传输到 Golang 中的另一个命令

mysql 触发器 for 循环

sql - 双外连接

java - 使用 Apache ANT 通过 plpgsql 函数以编程方式执行 sql 脚本失败

database - 如何在 postgresql 中循环遍历 string[]?

postgresql - Postgres外键上的删除约束