Linux RHEL 6.10 上的 Postgres 9.6.9
如果我将我的 DO 命令用双引号括起来,并将角色括在单引号中,那么 bash 会解释$$
, 显然会使命令失败。所以我切换了双引号和单引号,但现在它将NOT IN
字符串文字视为列名,这也会引发错误。
那么,正如标题中所提到的,让DO $$
命令从命令行工作的神奇秘诀是什么?
$ export PGHOST=10.x.y.z
$ export PGUSER=postgres
$ psql -c 'do $$
> declare rolename text;
> begin
> for rolename in select rolname
> from pg_roles
> where rolname not in ("postgres",
> "pg_signal_backend",
> "TAP")
> loop
> execute "DROP ROLE " || rolename;
> end loop;
> end $$
> ;'
ERROR: column "postgres" does not exist
LINE 3: where rolname not in ("postgres",...
^
QUERY: select rolname
from pg_roles
where rolname not in ("postgres", "pg_signal_backend", "TAP")
CONTEXT: PL/pgSQL function inline_code_block line 4 at FOR over SELECT rows
谢谢
用来
\
逃避美元$
参考psql doc,为了执行多个命令,它们还提供了 3 种解决方法,如下所示
1) 重复
-c
选项2) 结合
echo
和psql
3) 用途
psql
和EOF
此外,考虑
rolename text
改为rolename RECORD
避免ERROR: missing FROM-clause entry for table
(记录类型)就您的情况而言,
DROP ROLE
由于依赖关系,请小心(请参阅:drop role)最后但并非最不重要的,这是我的例子