tutorialspoint - PostgreSQL এ একসঙ্গে সব টেবিলের উপর OWNER সংশোধন করুন



(14)

আমি কিভাবে PostgreSQL ডাটাবেসের সমস্ত সারণীর মালিককে সংশোধন করব?

আমি নতুন ALTER TABLE * OWNER TO new_owner চেষ্টা করেছি ALTER TABLE * OWNER TO new_owner কিন্তু এটি তারকাচিহ্ন সিনট্যাক্স সমর্থন করে না।

https://src-bin.com


Answer #1

ডকার: সকল টেবিল + সিরিজ মালিক সংশোধন করুন

export user="your_new_owner"
export dbname="your_db_name"

cat <<EOF | docker run -i --rm --link postgres:postgres postgres sh -c "psql -h \$POSTGRES_PORT_5432_TCP_ADDR -p \$POSTGRES_PORT_5432_TCP_PORT -U postgres -d $dbname" | grep ALTER | docker run -i --rm --link postgres:postgres postgres sh -c "psql -h \$POSTGRES_PORT_5432_TCP_ADDR -p \$POSTGRES_PORT_5432_TCP_PORT -U postgres -d $dbname"
SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' OWNER TO $user;' FROM pg_tables WHERE schemaname = 'public';
SELECT 'ALTER SEQUENCE '||relname||' OWNER TO $user;' FROM pg_class WHERE relkind = 'S';
EOF

Answer #2

REASSIGN OWNED কমান্ড দেখুন

দ্রষ্টব্য: @Trygvis নীচের উত্তরটি উল্লেখ করে , REASSIGN OWNED কমান্ড কমপক্ষে সংস্করণ 8.2 থেকে পাওয়া যায় এবং এটি একটি সহজ পদ্ধতি।

যেহেতু আপনি সমস্ত সারণির জন্য মালিকানা পরিবর্তন করছেন, তাই সম্ভবত আপনি দৃশ্য এবং ক্রমও চান। আমি যা করেছি তা এখানে:

টেবিল:

for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" YOUR_DB` ; do  psql -c "alter table \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done

সিকোয়েন্স:

for tbl in `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" YOUR_DB` ; do  psql -c "alter sequence \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done

দেখা হয়েছে:

for tbl in `psql -qAt -c "select table_name from information_schema.views where table_schema = 'public';" YOUR_DB` ; do  psql -c "alter view \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done

আপনি সম্ভবত তিনটি জন্য পরিবর্তন বিবৃতি একক যেহেতু একটি বিট আপ DRY পারে।


Answer #3

@ অ্যালেক্স সোটো এর উত্তরটি সঠিক এবং @ ইয়ওভ আনারের আপলোডকৃত চিত্রটিও কাজ করে তবে টেবিল / ভিউ নামগুলিতে কোনও বিশেষ অক্ষর নেই (যা পোস্টগ্রেসের মধ্যে বৈধ)।

কাজ করার জন্য আপনাকে তাদের পালাতে হবে এবং এর জন্য আমি একটি আপলোড আপলোড করেছি: https://gist.github.com/2911117


Answer #4

PostgreSQL 9.0 থেকে শুরু করে, আপনার GRANT [priv name] ON ALL [object type] IN SCHEMA [priv name] GRANT [priv name] ON ALL [object type] IN SCHEMA যেখানে [priv name] সাধারণত SELECT, INSERT, UPDATE, DELETE, etc এবং [object type] হতে পারে:

  • TABLES
  • SEQUENCES
  • FUNCTIONS

GRANT এবং GRANT PostgreSQL এর দস্তাবেজ এই বিষয়ে আরো বিস্তারিত জানায়। কিছু পরিস্থিতিতে এটি এখনও সিস্টেম ক্যাটালগ জড়িত কৌশল ব্যবহার করতে হবে ( pg_catalog.pg_* ) তবে এটি প্রায় সাধারণ নয়। আমি ঘন ঘন নিম্নলিখিত কাজ করি:

  1. BEGIN একটি লেনদেন privs পরিবর্তন
  2. একটি "ডিবিএ ভূমিকা" DATABASES মালিকানা পরিবর্তন করুন
  3. SCHEMAS মালিকানা পরিবর্তন করুন "ডিবিএ ভূমিকা"
  4. সমস্ত ভূমিকা থেকে সব TABLES , SEQUENCES এবং FUNCTIONS সব গোপন করুন
  5. GRANT SELECT, INSERT, UPDATE, DELETE যথাযথ ভূমিকাগুলিতে উপযুক্ত / যথাযথ টেবিলে GRANT SELECT, INSERT, UPDATE, DELETE
  6. ডিসিএল লেনদেন COMMIT

Answer #5

আপনি REASSIGN OWNED কমান্ড ব্যবহার করতে পারেন।

সারমর্ম:

REASSIGN OWNED BY old_role [, ...] TO new_role

এটি old_role মালিকানাধীন সমস্ত বস্তুকে নতুন ভূমিকাতে পরিবর্তন করে। ব্যবহারকারীর কি ধরনের অবজেক্ট সম্পর্কে আপনি ভাবতে হবে না, তারা সব পরিবর্তন হবে। মনে রাখবেন এটি শুধুমাত্র একটি একক ডাটাবেসের অভ্যন্তরে বস্তুগুলিতে প্রযোজ্য। এটি নিজেই ডাটাবেসের মালিক পরিবর্তন করে না।

এটা অন্তত 8.2 ফিরে পাওয়া যায়। তাদের অনলাইন ডকুমেন্টেশন শুধুমাত্র যে ফিরে যায়।


Answer #6

আপনি PostgreSQL 9 এ নিম্নলিখিত চেষ্টা করতে পারেন

DO $$DECLARE r record;
BEGIN
    FOR r IN SELECT tablename FROM pg_tables WHERE schemaname = 'public'
    LOOP
        EXECUTE 'alter table '|| r.tablename ||' owner to newowner;';
    END LOOP;
END$$;

Answer #7

আমি টেবিল, মতামত এবং ক্রম মালিকানা পরিবর্তন করতে হয়েছিল এবং @Rjk দ্বারা পোস্ট করা দুর্দান্ত সমাধানটি ভাল কাজ করছে - একটি বিস্তারিত সত্ত্বেও: যদি বস্তুর নাম মিশ্র ক্ষেত্রে (যেমন "টেবিলনাম") হয় তবে এটি একটি " খুঁজে পাওয়া যায় নি "সন্ত্রাস।
এটিকে সঙ্কুচিত করার জন্য, বস্তুর নামগুলি '' 'এর মতো এইভাবে মোড়ানো করুন:

টেবিল

SELECT 'ALTER TABLE \"'|| schemaname || '.' || tablename ||'\" OWNER TO my_new_owner;'
FROM pg_tables WHERE NOT schemaname IN ('pg_catalog', 'information_schema')
ORDER BY schemaname, tablename;

সিকোয়েন্স

SELECT 'ALTER SEQUENCE \"'|| sequence_schema || '.' || sequence_name ||'\" OWNER TO my_new_owner;'
FROM information_schema.sequences WHERE NOT sequence_schema IN ('pg_catalog', 'information_schema')
ORDER BY sequence_schema, sequence_name;

দেখেছে

SELECT 'ALTER VIEW \"'|| table_schema || '.' || table_name ||'\" OWNER TO my_new_owner;'
FROM information_schema.views WHERE NOT table_schema IN ('pg_catalog', 'information_schema')
ORDER BY table_schema, table_name;

Answer #8

আমি যে জন্য একটি সুবিধাজনক স্ক্রিপ্ট তৈরি করেছি; pg_change_db_owner.sh । এই স্ক্রিপ্টটি ডাটাবেস স্কিমাতে সমস্ত টেবিল, দর্শন, ক্রম এবং ফাংশনগুলির জন্য মালিকানা পরিবর্তন করে এবং স্কিমাটির মালিকও।

দয়া করে নোট করুন যে আপনি যদি কোনও নির্দিষ্ট ডাটাবেসের মালিকানাধীন সমস্ত বস্তুর মালিকানা পরিবর্তন করতে চান তবে নির্দিষ্ট ডেটাবেস ভূমিকা মালিকানাধীন, তবে আপনি কেবল পরিবর্তে কমান্ড REASSIGN OWNED ব্যবহার করতে পারেন।


Answer #9

এটি: http://archives.postgresql.org/pgsql-bugs/2007-10/msg00234.php এছাড়াও একটি চমৎকার এবং দ্রুত সমাধান এবং এক ডেটাবেসে একাধিক স্কিমাসের জন্য কাজ করে:

টেবিল

SELECT 'ALTER TABLE '|| schemaname || '.' || tablename ||' OWNER TO my_new_owner;'
FROM pg_tables WHERE NOT schemaname IN ('pg_catalog', 'information_schema')
ORDER BY schemaname, tablename;

সিকোয়েন্স

SELECT 'ALTER SEQUENCE '|| sequence_schema || '.' || sequence_name ||' OWNER TO my_new_owner;'
FROM information_schema.sequences WHERE NOT sequence_schema IN ('pg_catalog', 'information_schema')
ORDER BY sequence_schema, sequence_name;

দেখেছে

SELECT 'ALTER VIEW '|| table_schema || '.' || table_name ||' OWNER TO my_new_owner;'
FROM information_schema.views WHERE NOT table_schema IN ('pg_catalog', 'information_schema')
ORDER BY table_schema, table_name;

বস্তুগত দৃশ্য

এই উত্তর উপর ভিত্তি করে

SELECT 'ALTER TABLE '|| oid::regclass::text ||' OWNER TO my_new_owner;'
FROM pg_class WHERE relkind = 'm'
ORDER BY oid;

এটি সমস্ত প্রয়োজনীয় ALTER TABLE / ALTER SEQUENCE / ALTER VIEW বিবৃতিগুলি জেনারেট করে, তাদের অনুলিপি করে এবং তাদের চালানোর জন্য তাদের পিএইচসিএলএলে আটকে দিন।

করছেন দ্বারা psql আপনার কাজ চেক করুন:

\dt *.*
\ds *.*
\dv *.*

Answer #10

খুব সহজ

  1. su - postgres
  2. psql
  3. [Old_user] থেকে [new_user] দ্বারা প্রস্তাবিত পুনঃনির্দেশ;
  4. \ সি [আপনার ডাটাবেস]
  5. [Old_user] থেকে [new_user] দ্বারা প্রস্তাবিত পুনঃনির্দেশ;

সম্পন্ন.


Answer #11

গৃহীত সমাধান ফাংশন মালিকানা যত্ন নিচ্ছে না সমাধান নিম্নলিখিত সবকিছু যত্ন নেয় (যখন আমি লক্ষ্য করেছি এটি উপরে @ ম্যাগিকোনয়ারের অনুরূপ)

echo "Database: ${DB_NAME}"
echo "Schema: ${SCHEMA}"
echo "User: ${NEW_OWNER}"

pg_dump -s -c -U postgres ${DB_NAME} | egrep "${SCHEMA}\..*OWNER TO"| sed -e "s/OWNER TO.*;$/OWNER TO ${NEW_OWNER};/" | psql -U postgres -d ${DB_NAME}
# do following as last step to allow recovery
psql -U postgres -d postgres -c "ALTER DATABASE ${DB_NAME} OWNER TO ${NEW_OWNER};"

Answer #12

নিম্নলিখিত সহজ শেল স্ক্রিপ্ট আমার জন্য কাজ করে।

#!/bin/bash
for i in  `psql -U $1  -qt -c  "select tablename from pg_tables where schemaname='$2'"`
do
psql -U $1 -c  "alter table $2.$i set schema $3"
done

ইনপুট $ 1 - ব্যবহারকারীর নাম (ডাটাবেস) $ 2 = বিদ্যমান স্কিমা $ 3 = নতুন স্কিমাতে।


Answer #13

share উপর ভিত্তি করে, এখানে একাধিক share সমাধান রয়েছে:

DO $$
DECLARE 
  r record;
  i int;
  v_schema text[] := '{public,schema1,schema2,schema3}';
  v_new_owner varchar := 'my_new_owner';
BEGIN
    FOR r IN 
        select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.tables where table_schema = ANY (v_schema)
        union all
        select 'ALTER TABLE "' || sequence_schema || '"."' || sequence_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.sequences where sequence_schema = ANY (v_schema)
        union all
        select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.views where table_schema = ANY (v_schema)
        union all
        select 'ALTER FUNCTION "'||nsp.nspname||'"."'||p.proname||'"('||pg_get_function_identity_arguments(p.oid)||') OWNER TO ' || v_new_owner || ';' as a from pg_proc p join pg_namespace nsp ON p.pronamespace = nsp.oid where nsp.nspname = ANY (v_schema)
        union all
        select 'ALTER DATABASE "' || current_database() || '" OWNER TO ' || v_new_owner 
    LOOP
        EXECUTE r.a;
    END LOOP;
    FOR i IN array_lower(v_schema,1) .. array_upper(v_schema,1)
    LOOP
        EXECUTE 'ALTER SCHEMA "' || v_schema[i] || '" OWNER TO ' || v_new_owner ;
    END LOOP;
END
$$;

Answer #14
pg_dump as insert statements 
pg_dump -d -O database filename
-d ( data as inserts ) -O ( capital O is no owner )

তারপরে PostgreSQL এ ব্যাকআপ ফাইলটি আবার ব্যবহার করুন:

psql -d database -U username -h hostname < filename

যেহেতু কোনও মালিক অন্তর্ভুক্ত নেই তাই তৈরি করা টেবিল, স্কিমা ইত্যাদি, আপনি নির্দিষ্ট লগইন ব্যবহারকারীর অধীনে তৈরি করেছেন।

আমি পোস্টগ্রে এসকিউএল সংস্করণগুলির মধ্যেও স্থানান্তরের জন্য এটি একটি ভাল পদ্ধতি হতে পারি।





postgresql