如何使用perl脚本创建一个postgresql区分大小写的数据库角色

问题描述:

在linux环境中,我试图使用perl脚本(createRole.pl)在postgresql数据库中创建一个新角色。有一个现有角色(Role1),由于initdb命令而存在。如何使用perl脚本创建一个postgresql区分大小写的数据库角色

现在我想创建一个新角色,而不使用数据库迁移并使用psql命令,因为我想要设置角色名称和密码。

从bash外壳(终端),有可能使用PSQL命令这样来创建新的角色(通​​过正确大写)(此方法将提示输入基于role1密码):

[[email protected] bin]# ./psql -p 1234 dbname -U Role1 -e -c "CREATE ROLE \"Role2\" WITH SUPERUSER LOGIN PASSWORD 'password';" 
Password for user Role1: 
CREATE ROLE "Role2" WITH SUPERUSER LOGIN PASSWORD 'password'; 
CREATE ROLE 

但它不通过这样的perl脚本工作:

use strict: 

my $dbCreateRole = '$newDBdir/bin/psql -A -p 1234 dbname -U Role1 -q -c "CREATE ROLE \"Role2\" WITH SUPERUSER CREATEDB CREATEROLE REPLICATION LOGIN PASSWORD \'password\';"'; 
if ($whoami eq 'root') { 
    $dbCreateRole =~ s/\"/\\\"/g; 
    $dbCreateRole = "su $appropriateUser -c \"$dbCreateRole\""; 
} 
system("export PGPASSWORD=password 2> /dev/null"); 
system("$dbCreateRole 2> /dev/null") == 0 || die("Unable to create Role2 database role.\n"); 

我已经尝试外双引号的各种组合和逃脱内单引号和双引号无济于事。

任何建议,将不胜感激。

不要打扰自己试图逃避各种文字。

相反,正是附上你想传递给数据库什么如下:

qq|insert your stuff here, no escapes| 

而且,做一个

=~ s 

操作时,选择一些其他的分隔符开始和结束的表达除了/,它会看起来更清洁,因为你正在处理表达式中的斜杠和反斜杠。

另一个重要的细节:不要使用系统调用来尝试传入密码。而是使用Perl DBI模块。

+0

取代Expect和命令行实用程序,最好只使用DBI。 – ThisSuitIsBlackNot

+0

我更正了我的答案以反映DBI。 –