Sistem kataloglarını yalnızca ne yaptığınızı tam olarak biliyorsanız doğrudan yönetmelisiniz. Beklenmedik yan etkileri olabilir. Veya veritabanını (veya tüm veritabanı kümesini) onarılamayacak şekilde bozabilirsiniz.
Jeremy'nin cevabı , temelde hile yaparken, halk için tavsiye edilmez . Şemadaki tüm işlevleri koşulsuz olarak değiştirir. Etkilenen herhangi bir sistem işlevi veya ek bir modül tarafından yüklenmiş işlevler olmadığından emin misiniz?
Ayrıca, önceden belirlenmiş sahibine ait olan işlevlerin sahibini değiştirmek de anlamsız olacaktır.
İlk olarak, REASSIGN OWNED
sizin için çalışıp çalışmadığını kontrol edin :
veritabanı rolüne ait veritabanı nesnelerinin sahipliğini değiştirme
Reddedilecek tüm rolleri açıkça listelemeniz gerekir. Ancak işlevleri yeniden atar .
Belirli bir şemadaki tüm işlevleri (ve başka bir nesneyi olmayan) yeni bir sahibe (isteğe bağlı olarak önceki sahibine bakılmaksızın) atamak için :
SELECT string_agg('ALTER FUNCTION ' || oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = 'public';
-- AND p.relowner <> (SELECT oid FROM pg_roles WHERE rolname = 'foo')
-- AND p.proname ~~ 'f_%'
Bu, tüm işlevleri (belirtilen şemada) değiştirmek için standart SQL komutlarıALTER FUNCTION ...
oluşturur . Komutları yürütmeden önce kontrol edebilirsiniz - birer birer veya hepsi aynı anda:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
WHERE
Sonuçları filtrelemek için kullanmak isteyebileceğiniz bazı yorumlu hükümler ekledim.
Döküm için regprocedure
, gerektiğinde çift tırnaklı, geçerli olduğunda şema nitelemeli parametrelerle geçerli bir işlev adı üretir search_path
.
Toplama fonksiyonu string_agg () PostgreSQL 9.0 veya üstünü gerektirir. Eski sürümde array_agg()
ve ile değiştirilir array_to_string()
.
Sen olabilir bir içine tüm bu koymak DO
deyimi veya bu ilgili cevap gösterildiği gibi bir fonksiyonu:
Postgres 9.5 veya sonraki sürümlerinde, sorguyu yeni nesne tanımlayıcı türleriniregnamespace
regrole
kullanarak basitleştirebilirsiniz ve :
SELECT string_agg('ALTER FUNCTION '|| oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc
WHERE pronamespace = 'public'::regnamespace;
-- AND relowner <> 'foo'::regrole
-- AND proname ~~ 'f_%'
pg_proc.proisagg
pg 11'de değiştirilir sürüm notları ki: sistem tablo değiştirinpg_proc
'ınproisagg
veproiswindow
ileprokind
(Peter Eisentraut) `