Postgres 사용자가 있는지 확인하는 방법은 무엇입니까?


89

createuserPostgreSQL에서 사용자 (ROLE) 생성을 허용합니다. 해당 사용자 (이름)가 이미 존재하는지 확인하는 간단한 방법이 있습니까? 그렇지 않으면 createuser가 오류를 반환합니다.

createuser: creation of new role failed: ERROR:  role "USR_NAME" already exists

업데이트 :이 솔루션은 스크립트 내에서 자동화하기가 더 쉽도록 셸에서 실행 가능한 것이 좋습니다.

답변:


161
SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'

그리고 명령 줄 측면에서 (Erwin 덕분에) :

psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'"

발견되면 1을 산출하고 다른 것은 없습니다.

그건:

psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'" | grep -q 1 || createuser ...

SQL을 실행하기위한 기본 제공 명령 줄 유틸리티가 무엇인지 기억하십니까? 결국 나는 가능한 경우 쉘에서 결과를 실행하고 검색하는 것을 선호합니다.
m33lky

1
psql명령입니다. 그러나 createuser명령 줄 유틸리티 에 대해 이야기하는 경우 (분명히 그렇습니다 create user. 처음 에는 공간이 부족하다는 것을 알지 못함 ) 종료 상태를 무시하고 출력을 /dev/null.
Michael Krelin-해커

2
@ m33lky : 또는 셸에서이 명령의 반환 값을 테스트 할 수 있습니다 (postgres 사용자로) : psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'". 1발견되면 양보 하고 다른 것은 없습니다.
Erwin Brandstetter 2011

1
하하, 나는 좀 더 못생긴 방식으로 그것을했다 : echo "SELECT rolname FROM pg_roles WHERE rolname='USR_NAME';" | psql | grep -c USR_NAME. psql 후에 "postgres"없이 솔루션을 답변으로 추가하십시오.
m33lky 2011

2
@ m33lky : 나는 마이클이 이것에 대한 크레딧을받을 자격이 있다고 생각하기 때문에 단지 코멘트를 썼습니다. 그는 주요 부분을 기여했습니다. 그리고 그는 과거에 좋은 스포츠였습니다. :) 아마도 Michael이 그의 대답에 그것을 통합하고 싶습니까?
Erwin Brandstetter 2011

5

db가 있는지 확인 하는 것과 동일한 아이디어를 따릅니다.

psql -t -c '\du' | cut -d \| -f 1 | grep -qw <user_to_check>

다음과 같은 스크립트에서 사용할 수 있습니다.

if psql -t -c '\du' | cut -d \| -f 1 | grep -qw <user_to_check>; then
    # user exists
    # $? is 0
else
    # ruh-roh
    # $? is 1
fi

이것은 answer stackoverflow.com/a/8546783/107158 보다 더 큰 쿼리 결과를 생성합니다 . 그러나 그 대답과 달리 이것은 system table로 이름을 바꾸어도 살아남을 수 pg_roles있지만 command로 변경되지는 않습니다 \du. 변경되지 않을 가능성이 가장 높은 것은 무엇입니까?
Derek Mahar 2016 년

3

이것이 파이썬 에서이 일을하는 사람들에게 도움이되기를 바랍니다 .
GitHubGist에서 완전한 작동 스크립트 / 솔루션을 만들었습니다.이 코드 스 니펫 아래의 URL을 참조하세요.

# ref: /programming/8546759/how-to-check-if-a-postgres-user-exists
check_user_cmd = ("SELECT 1 FROM pg_roles WHERE rolname='%s'" % (deis_app_user))

# our create role/user command and vars
create_user_cmd = ("CREATE ROLE %s WITH LOGIN CREATEDB PASSWORD '%s'" % (deis_app_user, deis_app_passwd))

# ref: /programming/37488175/simplify-database-psycopg2-usage-by-creating-a-module
class RdsCreds():
    def __init__(self):
        self.conn = psycopg2.connect("dbname=%s user=%s host=%s password=%s" % (admin_db_name, admin_db_user, db_host, admin_db_pass))
        self.conn.set_isolation_level(0)
        self.cur = self.conn.cursor()

    def query(self, query):
        self.cur.execute(query)
        return self.cur.rowcount > 0

    def close(self):
        self.cur.close()
        self.conn.close()

db = RdsCreds()
user_exists = db.query(check_user_cmd)

# PostgreSQL currently has no 'create role if not exists'
# So, we only want to create the role/user if not exists 
if (user_exists) is True:
    print("%s user_exists: %s" % (deis_app_user, user_exists))
    print("Idempotent: No credential modifications required. Exiting...")
    db.close()
else:
    print("%s user_exists: %s" % (deis_app_user, user_exists))
    print("Creating %s user now" % (deis_app_user))
    db.query(create_user_cmd)
    user_exists = db.query(check_user_cmd)
    db.close()
    print("%s user_exists: %s" % (deis_app_user, user_exists))

멱등 원격 (RDS) PostgreSQL이 CM 모듈없이 Python에서 역할 / 사용자를 생성합니다.


1

psql -qtA -c "\du USR_NAME" | cut -d "|" -f 1

[[ -n $(psql -qtA -c "\du ${1}" | cut -d "|" -f 1) ]] && echo "exists" || echo "does not exist"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.