postgresユーザーが存在するかどうかを確認する方法は?


89

createuserPostgreSQLでユーザー(ROLE)を作成できます。そのユーザー(名前)がすでに存在するかどうかを確認する簡単な方法はありますか?それ以外の場合、createuserはエラーを返します。

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

更新:ソリューションは、スクリプト内で自動化するのが簡単になるように、シェルから実行可能にする必要があります。

回答:


158
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 2011

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

2
@ m33lky:私はコメントを書いただけです。なぜなら、マイケルはこのコメントの功績に値すると思うからです。彼は本編を寄稿した。そして彼は過去に良いスポーツであることが証明されました。:)たぶんマイケルはそれを彼の答えに取り入れたいのですか?
Erwin Brandstetter、2011

5

データベースが存在するかどうか確認するのと同じ考えに従う

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

これは、stackoverflow.com / a / 8546783/107158の回答よりも大きなクエリ結果を生成します。ただし、その回答とは異なり、これはシステムテーブルへの名前変更を存続させますがpg_roles、コマンドへの変更を存続させません\du。変化しない可能性が最も高いのはどれですか?
Derek Mahar、2016年

3

これがpythonでこれをしているかもしれないあなたたちの助けになることを願っています。
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作成ロール/ユーザーをPythonからCMモジュールなしで提供します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.