Czy to prawda, że NIE można utworzyć użytkownika kopii zapasowej tylko do odczytu w PostgreSQL?
Powiedziano mi na kanale IRC, że po prostu nie możesz mieć użytkownika kopii zapasowej bez uprawnień własności. Uważam to za bardzo dziwne, więc chcę się upewnić, że czegoś nie umknie.
Poniżej próbowałem, ale nie daje to wyników, których szukam. Kiedy robię pg_dump
na danym stole, otrzymuję Permission denied for relation...
:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup;
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO backup;
Każda pomoc byłaby bardzo mile widziana!
backup
postgresql-9.1
permissions
milosgajdos
źródło
źródło
Odpowiedzi:
Nie, to proste (teraz i tak).
Udziel uprawnienia do połączenia nowemu użytkownikowi
Przyznaj uprawnienia do wszystkich bieżących obiektów bazy danych. Jest to specyficzne dla schematu i będziesz musiał uruchomić jedną kopię dla każdego schematu, którego chcesz użyć dla użytkownika,
Od docs ,
ALL TABLES
zawiera wszystko, czego chcesz.Następnie,
ALTER DEFAULT PRIVLEGES
aby przyznać przyszłeSELECT
uprawnienia dla obiektów, które nie zostały jeszcze utworzone.źródło
ALTER DEFAULT PRIVILEGES ... myReadonlyUser
, 2 dodatkowe linie są dodawane do zrzutu:ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM root;
. Wygląda na to, że root nie będzie mógł nic zrobić na nowych stołach. Czy to prawda?bigint
tylko do odczytu użytkownika, prawdopodobnie również będą potrzebneGRANT SELECT ON ALL SEQUENCES
Prostym i przyjemnym sposobem jest utworzenie superużytkownika z uprawnieniem tylko do odczytu.
psql
jako postgres lub inny administrator.Utwórz nową rolę superużytkownika i ustaw ją tylko do odczytu:
<PASS>
wybranym hasłem.backadm
wybraną nazwą użytkownika. (Postawiłembackadm
naBackup Administrator
).Możesz teraz użyć tej roli do tworzenia kopii zapasowych.
źródło
SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
lubALTER USER backadm set default_transaction_read_only = off;
nie ma nieograniczonego dostępu do bazy danych.Uwaga: blog wymieniony w odpowiedzi udzielonej przez @Gyre nie będzie działał przy tworzeniu użytkownika „tylko do odczytu” aplikacji (tj. Do tworzenia roli tylko do odczytu dla aplikacji sieci Web łączącej się z bazą danych) i może spowodować poważne luka w zabezpieczeniach, ponieważ jest łatwa do obejścia, jak wyjaśniono w odpowiedzi na listę postgresql . Dla odniesienia, przez klienta przesłaniającego ustawienia sesji:
Zapoznaj się z prezentacją „Zarządzanie prawami w postgresql” połączonej z wiki postgres, aby uzyskać bardziej szczegółową metodę, podobną do tej zamieszczonej w pytaniu.
źródło
Po ponownym przetestowaniu rozwiązania Evana Carolla natrafiłem na ten błąd:
brakuje jeszcze jednego uprawnienia:
Dodanie tego uprawnienia pozwoliło mi wykonać kopię zapasową z moim użytkownikiem tylko do odczytu.
źródło
Przeprowadziłem odpowiednie badania i wydaje się, że istnieje na to rozwiązanie. Natrafiłem na ten post na blogu, który doskonale wyjaśnia, co należy zrobić. Mam nadzieję, że to pomaga ludziom, którzy szukają tej samej odpowiedzi co ja. Oczywiście - przywracanie kopii zapasowych wykonanych w ten sposób to inna kwestia.
źródło
ALTER USER set default_transaction_read_only = on;
, że nie uniemożliwia to użytkownikowi jego zmiany.