Bir postgres kullanıcısının var olup olmadığı nasıl kontrol edilir?


89

createuserPostgreSQL'de bir kullanıcı (ROLE) oluşturulmasına izin verir. Bu kullanıcının (adın) zaten mevcut olup olmadığını kontrol etmenin basit bir yolu var mı? Aksi takdirde createuser bir hata ile döner:

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

GÜNCELLEME: Çözüm, tercihen kabuktan çalıştırılabilir olmalıdır, böylece bir komut dosyası içinde otomatikleştirme daha kolay olur.

Yanıtlar:


161
SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'

Ve komut satırı açısından (Erwin'e teşekkürler):

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

Bulunursa 1 verir, başka hiçbir şey vermez.

Yani:

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

SQL'i yürütmek için yerleşik komut satırı yardımcı programının ne olduğunu hatırlıyor musunuz? Sonunda, mümkünse sonucu kabuktan çalıştırmayı ve almayı tercih ederim.
m33lky

1
psqlkomuttur. Ancak createuserkomut satırı yardımcı programından bahsediyorsanız (tabii ki anladınız, create userilk başta boşluk olmadığını fark etmedim ), o zaman çıkış durumunu görmezden gelmek ve çıktıyı /dev/null.
Michael Krelin - hacker

2
@ m33lky: Yoksa (postgres kullanıcı olarak) kabukta bu komutun dönüş değeri test edebilir: psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='USR_NAME'". Bulunursa verim 1verir ve başka hiçbir şey olmaz.
Erwin Brandstetter

1
Haha, biraz daha çirkin bir şekilde yaptım: echo "SELECT rolname FROM pg_roles WHERE rolname='USR_NAME';" | psql | grep -c USR_NAME. Çözümünüzü psql'den sonra "postgres" olmadan bir yanıt olarak ekleyin.
m33lky

2
@ m33lky: Ben sadece bir yorum yazdım, çünkü Michael'ın bu konuda övgüyü hak ettiğini düşünüyorum. Ana kısma katkıda bulundu. Ve geçmişte iyi bir spor olduğunu kanıtladı. :) Belki Michael bunu cevabına dahil etmek ister?
Erwin Brandstetter

5

Bir db'nin var olup olmadığını kontrol etmekten daha aynı fikri takip etmek

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

ve bunu aşağıdaki gibi bir komut dosyasında kullanabilirsiniz:

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

Bu, stackoverflow.com/a/8546783/107158 yanıtından daha büyük bir sorgu sonucu oluşturur . Ancak, bu cevabın aksine, bu, sistem tablosuna yeniden adlandırıldıktan sonra hayatta kalır pg_roles, ancak komutta bir değişiklik olmaz \du. Hangisi büyük olasılıkla değişmeyecek?
Derek Mahar

3

Bu bu yapıyor olabilir olanlarınız yardımcı olur umarım piton .
GitHubGist'te eksiksiz bir çalışan komut dosyası / çözüm oluşturdum - bu kod parçacığının altındaki URL'ye bakın.

# 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))

İdempotent remote (RDS) PostgreSQL'in CM modülleri olmadan python'dan rol / kullanıcı oluşturmasını sağlar, vb.


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"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.