2017-02-23 1 views
0

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"); 

ご意見をお寄せください。

答えて

0

さまざまなリテラルをエスケープしようとすると、自分自身を歪曲しないでください。

代わりに、次のようにデータベースに渡したいものを正確に囲み:

qq|insert your stuff here, no escapes| 

をまた、

=~ s 

操作を行う場合、起動や表現を終了するには、いくつかの他の区切り文字を選択します/と、式の中でスラッシュやバックスラッシュを扱っているので、はるかにきれいに見えます。

重要なもう1つの重要な点は、パスワードを渡すためにシステムコールを使用しないことです。代わりに、Perl DBIモジュールを使用してください。

+0

Expectとコマンドラインユーティリティの代わりに、DBIを使用する方が良いでしょう。 – ThisSuitIsBlackNot

+0

私はDBIを反映するために私の答えを修正しました。 –

関連する問題