PostgreSQL Zmień właściciela wszystkich tabel w ramach określonego schematu


19

Próbuję zmienić właściciela wszystkich tabel w tym samym schemacie w jednym wierszu polecenia. tj alter table schema_name.* owner to newowner. : Czy istnieje sposób na osiągnięcie tego?

Odpowiedzi:


11

Ponownie przypisany

Jest to szczególny przywilej, że komenda nie tylko tego RESASSIGN OWNED. Spowoduje to ponowne przypisanie wszystkich obiektów, nie tylko tych w określonym schemacie.

Specyficzne dla schematu

Możesz wygenerować ALTER TABLEpolecenia z następującymi,

SELECT format(
  'ALTER TABLE %I.%I.%I OWNER TO %I;',
  table_catalog,
  table_schema,
  table_name,
  current_user  -- or another just put it in quotes
)
FROM information_schema.tables
WHERE table_schema = 'mySchema';

W psql możesz je uruchomić, wykonując je natychmiast za pomocą \gexec


8

Nie znam żadnego sposobu, aby to osiągnąć wyłącznie za pomocą psql, ale używając bash, możesz wyświetlić tabele w bazie danych $ DB za pomocą:

psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}

Własność można przenieść na $ OWNER za pomocą:

psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB}

Łączenie tego razem daje:

 $ for table in `psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}` ; do  psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB} ; done

$ DB, $ SCHEMA i $ OWNER reprezentują odpowiednio bazę danych, schemat (zwykle „publiczny”) i nazwę nowego właściciela.


7

Jeśli możesz zapytać o nazwy tabel w schemacie, możesz wygenerować zapytania, aby zmienić właściciela tabeli.

Na przykład:

 select 'ALTER TABLE ' || t.tablename || ' OWNER TO new_owner;' 
 from  pg_tables t
 where t.tableowner != 'rdsadmin';

zwróci zapytanie, aby zmienić własność wszystkich tabel:

ALTER TABLE schema_version OWNER TO ali;
ALTER TABLE users OWNER TO ali; 
ALTER TABLE company OWNER TO ali;
ALTER TABLE books OWNER TO ali;
...

możesz po prostu uruchomić te :)




0

Jest to funkcja, której używam do zmiany własności tabeli, widoku i funkcji w schemacie. Jest szybki, czysty i stanowi dobry przykład użycia kursorów. Ponadto nie jest wymagany wiersz poleceń.

Następujące zmiany zmienią uprawnienia za pomocą funkcji plpgsql:

CREATE OR REPLACE FUNCTION YOURSCHEMA.do_changeowner(
    newowner text,
    pschem text)
  RETURNS void AS
$BODY$
declare
  tblnames CURSOR FOR
    SELECT tablename FROM pg_tables
    WHERE schemaname = pschem;
  viewnames CURSOR FOR
    SELECT viewname FROM pg_views
    WHERE schemaname = pschem;
  funcnames CURSOR FOR
    SELECT p.proname AS name, pg_catalog.pg_get_function_identity_arguments(p.oid) as params
    FROM pg_proc p 
    JOIN pg_namespace n ON n.oid = p.pronamespace 
    WHERE n.nspname = pschem;

begin

  FOR stmt IN tblnames LOOP
    EXECUTE 'alter TABLE ' || pschem || '.' || stmt.tablename || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN viewnames LOOP
    EXECUTE 'alter VIEW ' || pschem || '.' || stmt.viewname || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN funcnames LOOP
    EXECUTE 'alter FUNCTION ' || pschem || '.' || stmt.name || '(' ||  stmt.params || ') owner to ' || newowner || ';';
  END LOOP;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.