Linux環境では、perlスクリプト(createRole.pl)を使用してpostgresqlデータベースに新しいロールを作成しようとしています。 initdbコマンドの結果として存在する既存のロール(Role1)が存在します。perlスクリプトを使用してpostgresqlの大文字と小文字を区別するデータベースロールを作成する方法
ここでdb migrateとpsqlコマンドを使わずに新しいロールを作成したいのですが、ロール名とパスワードの両方を設定したいからです。
bashシェル(ターミナル)から、(このメソッドはROLE1パスワードの入力を要求します)、このようにpsqlコマンドを使用して(適切な大文字で)新しい役割を作成することが可能です:
[[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");
。
ご意見をお寄せください。
Expectとコマンドラインユーティリティの代わりに、DBIを使用する方が良いでしょう。 – ThisSuitIsBlackNot
私はDBIを反映するために私の答えを修正しました。 –