如何使用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模块。
取代Expect和命令行实用程序,最好只使用DBI。 – ThisSuitIsBlackNot
我更正了我的答案以反映DBI。 –