Bir komut satırında aynı şema altında tüm tabloların sahibini değiştirmeye çalışıyorum. yani: alter table schema_name.* owner to newowner
. Bunu başarmanın bir yolu var mı?
Bir komut satırında aynı şema altında tüm tabloların sahibini değiştirmeye çalışıyorum. yani: alter table schema_name.* owner to newowner
. Bunu başarmanın bir yolu var mı?
Yanıtlar:
Sadece bunu yapan özel bir ayrıcalık komutu var RESASSIGN OWNED
. Bu, yalnızca belirli bir şemadaki nesneleri değil, tüm nesneleri yeniden atar.
Sen oluşturabilir ALTER TABLE
, aşağıdaki ile komutları
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';
Psql'de, bunları hemen takip ederek çalıştırabilirsiniz. \gexec
Bu tamamen psql yoluyla başarmak için herhangi bir yol bilmiyorum, ama bash kullanarak, veritabanı $ DB tabloları listeleyebilirsiniz:
psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}
Ve sahiplik şu şekilde $ OWNER'a devredilebilir:
psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB}
Bunu bir araya getirmek size şunları sağlar:
$ 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 ve $ OWNER sırasıyla veritabanını, şemayı (genellikle 'genel') ve yeni sahibin adını temsil eder.
Şemanızdaki tablenames sorgulayabilirseniz, ALTER tablo sahipliği sorguları oluşturabilirsiniz.
Örneğin:
select 'ALTER TABLE ' || t.tablename || ' OWNER TO new_owner;'
from pg_tables t
where t.tableowner != 'rdsadmin';
tüm tabloların sahipliğini değiştirmek için sorguyu döndürür:
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;
...
o zaman sadece bunları çalıştırabilirsiniz :)
Bu script hile yapacak.
sh change_owner.sh -n new_owner -S schema_name
sh change_owner.sh -n user1 -S public
Summary:
Tables/Sequences/Views : 16
Functions : 43
Aggregates : 1
Type : 2
burada bulundu https://github.com/trrao/PostgreSQL_Scripts
Yukarıdaki bash kullanarak benzer ama bir metin dosyasında çıktı ve daha sonra psql girmek zorunda kaldı:
$ psql -qAt -d mydatabase -c "SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' \
OWNER TO new_owner;' \
FROM pg_tables \
WHERE schemaname = 'myschema'" > data.txt
$ psql < data.txt -d mydatabase
Buna dayanarak, ancak veritabanı eklendi: http://penningpence.blogspot.ca/2014/09/changing-owner-of-multiple-database.html
Bu, bir şemadaki tablo, görünüm ve işlev sahipliğini değiştirmek için kullandığım bir işlevdir. Hızlı, temiz ve imleçlerin nasıl kullanılacağına iyi bir örnektir. Ayrıca, komut satırı gerekmez.
Aşağıdakiler plpgsql işleviyle izinleri değiştirir:
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;