मैं एक कमांड लाइन में एक ही स्कीमा के तहत सभी तालिकाओं के मालिक को बदलने की कोशिश कर रहा हूं। अर्थात्: alter table schema_name.* owner to newowner
। क्या इसे पूरा करने का कोई तरीका है?
मैं एक कमांड लाइन में एक ही स्कीमा के तहत सभी तालिकाओं के मालिक को बदलने की कोशिश कर रहा हूं। अर्थात्: alter table schema_name.* owner to newowner
। क्या इसे पूरा करने का कोई तरीका है?
जवाबों:
वहाँ एक विशिष्ट विशेषाधिकार आदेश है कि करता है तो बस इस, है RESASSIGN OWNED
। यह सभी वस्तुओं को पुन: निर्दिष्ट करता है, न कि केवल एक विशिष्ट स्कीमा में।
आप ALTER TABLE
निम्न के साथ कमांड उत्पन्न कर सकते हैं ,
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 में, आप इसे तुरंत साथ पालन करके चला सकते हैं \gexec
मैं इसे विशुद्ध रूप से psql के माध्यम से पूरा करने का कोई तरीका नहीं जानता, लेकिन बैश का उपयोग करके, आप डेटाबेस में तालिकाओं को $ DB में सूचीबद्ध कर सकते हैं:
psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}
और स्वामित्व को $ OWNER के साथ स्थानांतरित किया जा सकता है:
psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB}
इसे एक साथ स्ट्रिंग आपको देता है:
$ 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 और $ OWNER क्रमशः डेटाबेस, स्कीमा (आमतौर पर 'सार्वजनिक') और नए मालिक के नाम का प्रतिनिधित्व करते हैं।
यदि आप अपने स्कीमा में टैबलेनैम को क्वेरी कर सकते हैं, तो आप प्रश्नों को तालिका के स्वामित्व में उत्पन्न कर सकते हैं।
उदाहरण के लिए:
select 'ALTER TABLE ' || t.tablename || ' OWNER TO new_owner;'
from pg_tables t
where t.tableowner != 'rdsadmin';
सभी तालिकाओं के स्वामित्व को बदलने के लिए क्वेरी वापस करेगा:
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;
...
तो आप बस ये चला सकते हैं :)
यह स्क्रिप्ट ट्रिक करेगी।
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
यहाँ पाया गया https://github.com/trrao/PostgreSQL_Scripts
बैश का उपयोग करने के लिए ऊपर के समान लेकिन मुझे एक पाठ फ़ाइल में आउटपुट करना पड़ा और फिर psql में इनपुट करना पड़ा:
$ 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
इसके आधार पर, लेकिन डेटाबेस को जोड़ा गया: http://penningpence.blogspot.ca/2014/09/changing-owner-of-multiple-database.html
यह एक फ़ंक्शन है जिसे मैं स्कीमा में तालिका, दृश्य और फ़ंक्शन स्वामित्व बदलने के लिए उपयोग करता हूं। यह तेज, स्वच्छ और एक अच्छा उदाहरण है कि कैसे श्रोताओं का भी उपयोग किया जाए। इसके अलावा, कोई कमांड लाइन की आवश्यकता नहीं है।
निम्नलिखित 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;