2017-02-23 6 views
0

리눅스 환경에서 perl 스크립트 (createRole.pl)를 사용하여 postgresql 데이터베이스에서 새 역할을 만들려고합니다. initdb 명령의 결과로 존재하는 기존 역할 (Role1)이 있습니다.perl 스크립트를 사용하여 postgresql 대소 문자를 구분하는 데이터베이스 역할을 만드는 방법

이제 DB 마이그레이션과 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 

: 배시 쉘 (단말)에서

, (이 방법은 Role1 암호를 묻는) 이렇게 psql의 명령을 사용하여 (적절한 상부 케이스와 함께) 새로운 역할을 생성 할 수있다 그러나이 같은 펄 스크립트를 통해 작동하지 않습니다 내가 외부 따옴표의 다양한 조합을 시도하고 아무 소용이 내부 작은 따옴표와 큰 따옴표를 탈출

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 

작업을 수행 할 때, 시작하고 식을 끝으로 다른 구분 기호를 선택 게다가 /와 표현식 안에서 슬래시와 역 슬래시를 다루기 때문에 훨씬 더 깔끔 해 보입니다.

또 다른 중요한 세부 정보 : 시스템 호출을 사용하여 암호를 전달하지 마십시오. 대신 Perl DBI 모듈을 사용하십시오.

+0

Expect 및 명령 줄 유틸리티 대신 DBI 만 사용하는 것이 좋습니다. – ThisSuitIsBlackNot

+0

DBI를 반영하여 답을 수정했습니다. –