পোস্টগ্রিজএসকিউএল ভূমিকার সাথে যুক্ত লিখিত সামগ্রীগুলি সন্ধান করুন


12

কিছু সময় আগে আমি ইউজার 1 নামের একটি পোস্টগ্র্যাসকিউএল ব্যবহারকারী তৈরি করেছি (পোস্টগ্র্যাসকিউএল 9.4.9)।

আমি এই ব্যবহারকারীকে বাদ দিতে চাই। সুতরাং আমি প্রথমে টেবিল, ক্রম, ফাংশন, ডিফল্ট সুবিধাগুলি এবং মালিকানার সমস্ত অনুমতি বাতিল করে দিই:

ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON SEQUENCES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM user1;

REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM user1;

REASSIGN OWNED BY user1 TO postgres;

তবে মনে হয় যে একটি ব্যবহারকারীর সাথে 2 টি ডাটাবেসে এই ব্যবহারকারীর সাথে সংযুক্ত রয়েছে:

postgres=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  1 object in database db1
1 object in database db2

এমনকি এটি একটি ফাংশন বলে মনে হচ্ছে:

postgres=# \c db1
You are now connected to database "db1" as user "postgres".
db1=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  privileges for function text(boolean)
1 object in database db2

তবে কোনটি অবজেক্টের মালিকানাধীন বা ব্যবহারকারীর সাথে সম্পর্কিত তা আমি নির্ধারণ করতে পারি না।

আমি যদি pg_dump -s db1 | grep user1কোন ফল পাই! এটি একটি বিশ্বব্যাপী বস্তু হতে পারে?

আমি কীভাবে অনুপস্থিত বস্তুটি সনাক্ত করতে পারি?

আমি প্রতিটি ডাটাবেসে কমান্ডগুলি কার্যকর করেছি (db1 এবং db2)। আমি মালিকানাধীন অবজেক্টগুলিকে ফেলে দিতে চাই না user1, কেবল এই ব্যবহারকারীর জন্য অনুদান পুনরায় নিয়োগ বা মুছে ফেলতে চাই।

উত্তর:


10

জিজ্ঞাসা করা প্রশ্নের উত্তর

ত্রুটি বার্তায় এবং এর মালিকের মধ্যে ফাংশনটি সন্ধান করতে:

SELECT oid::regprocedure AS function
     , pg_get_userbyid(proowner) AS owner
FROM   pg_proc
WHERE  oid = 'text(boolean)'::regprocedure;

সম্পর্কিত:

আসল সমস্যা

ত্রুটি বার্তাটি বলে:

বিবরণ: ফাংশন পাঠ্যের জন্য সুবিধা (বুলিয়ান)

এটা না মালিকানা সম্পর্কে কিন্তু সম্পর্কে বিশেষাধিকার

জন্য ম্যানুয়াল DROP ROLE:

ভূমিকা নামানোর আগে, আপনাকে অবশ্যই তার মালিকানাধীন সমস্ত অবজেক্টগুলি (বা তাদের মালিকানা পুনরায় স্বাক্ষর করতে হবে) ফেলে দিতে হবে এবং অন্যান্য বস্তুগুলিতে ভূমিকাটি প্রদত্ত কোনও সুযোগগুলি প্রত্যাহার করতে হবে

এবং এর জন্য ALTER DEFAULT PRIVILEGES:

যদি আপনি এমন কোনও ভূমিকা বাদ দিতে চান যার জন্য ডিফল্ট সুযোগ-সুবিধাগুলি পরিবর্তিত হয়েছে, তবে এটির ডিফল্ট সুযোগ-সুবিধার পরিবর্তনগুলি প্রত্যাবর্তন করা উচিত বা ভূমিকার জন্য ডিফল্ট সুবিধাগুলি প্রবেশ থেকে মুক্তি পাওয়ার জন্য DROP OWNEDBY ব্যবহার করা প্রয়োজন

দেখে মনে হচ্ছে আপনি কেবল REASSIGN OWNEDএকটি ডিবিতে মৃত্যুদন্ড কার্যকর করেছেন তবে ম্যানুয়ালটি নির্দেশ দেয়:

যেহেতু REASSIGN OWNEDঅন্যান্য ডাটাবেসের মধ্যে অবজেক্টগুলিকে প্রভাবিত করে না, সাধারণত প্রতিটি ডাটাবেসে এই কমান্ডটি কার্যকর করা প্রয়োজন যা মুছে ফেলার জন্য কোনও ভূমিকার মালিকানাধীন অবজেক্টগুলি ধারণ করে।

বোল্ড জোর আমার।

এবং আপনি আপনার আদেশগুলি দিয়ে সীমাবদ্ধ করেছেন IN SCHEMA public। পুরো ডিবি লক্ষ্য করে সেই ধারাটি ফেলে দিন। কিন্তু বিরক্ত করবেন না, একটি আছে ...

সঙ্গে সহজ সমাধান DROP OWNED

REASSIGN OWNED BY user1 TO postgres;
DROP OWNED BY user1;

ভূমিকার সমস্ত বিষয়বস্তু postgresপ্রথম কমান্ডের সাথে মালিকানার পরিবর্তন করেছে এবং এখন নিরাপদ। শব্দগুচ্ছটি DROP OWNEDকিছুটা বিভ্রান্তিকর, যেহেতু এটি সমস্ত সুযোগ-সুবিধা এবং ডিফল্ট সুযোগগুলি থেকেও মুক্তি পায়। জন্য ম্যানুয়াল DROP OWNED:

DROP OWNEDবর্তমান ডাটাবেসের মধ্যে এমন সমস্ত বস্তু ফেলে দেয় যা নির্দিষ্ট রোলগুলির মধ্যে একটির মালিকানাধীন। বর্তমান ডাটাবেসে এবং ভাগ করা বস্তুগুলিতে (ডাটাবেস, টেবিলস্পেস) উপর প্রদত্ত ভূমিকার জন্য প্রদত্ত যে কোনও সুযোগ-সুবিধাও বাতিল করা হবে।

সমস্ত প্রাসঙ্গিক ডিবিতে পুনরাবৃত্তি করুন, তারপরে আপনি হত্যার জন্য এগিয়ে যেতে পারেন:

DROP ROLE user1;

6

নীচের ক্যোয়ারিতে মালিকদের সাথে অবজেক্টগুলি তালিকাভুক্ত করা হয়েছে। সমস্ত সুযোগ সুবিধার জন্য আমাদের আরও বেশি প্রয়োজন।

--r = ordinary table, i = index, S = sequence, v = view, m = materialized view, c = composite type, t = TOAST table, f = foreign table
SELECT 
    n.nspname AS schema_name,
    c.relname AS rel_name,
    c.relkind AS rel_kind,
    pg_get_userbyid(c.relowner) AS owner_name
  FROM pg_class c
  JOIN pg_namespace n ON n.oid = c.relnamespace

UNION ALL

-- functions (or procedures)
SELECT
    n.nspname AS schema_name,
    p.proname,
    'p',
    pg_get_userbyid(p.proowner)
  FROM pg_proc p
  JOIN pg_namespace n ON n.oid = p.pronamespace

এটির সাথে আমি এখনও নিখোঁজ হওয়া জিনিসটি পাই না।
নিকোলাস পেয়ার্ট

@ নিকোলাসপায়ার্ট: আপনি কি সঠিক ডাটাবেসে কোয়েরিটি সম্পাদন করছেন?
এরউইন ব্র্যান্ডসেটেটার

1

আপনাকে প্রথমে ডাটাবেসের সাথে সংযোগ স্থাপন করতে হবে। আপনার উদাহরণে যে হবে

\c db1

এবং

\c db2

তারপরে পুনরায় সমস্ত প্রাইভেটিজ এবং পুনরায় স্বীকৃত / ড্রপ মালিকানাধীন বিবৃতি চালানোর চেষ্টা করুন।


1
আরে, আপনার প্রথম উত্তরের জন্য ধন্যবাদ। তবে পোস্ট করার আগে দয়া করে এটি বিদ্যমান উত্তরগুলিতে কী যুক্ত করে তা নিয়ে ভাবুন এবং আপনার উত্তরেও এটি বর্ণনা করুন।
dezso
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.