পোস্টগ্রিএসকিউএল - কীভাবে বিদ্যমান সুবিধাগুলি সহ কোনও ব্যবহারকারীকে দ্রুত ফেলে দেওয়া যায়


122

আমি যে অ্যাপটিতে কাজ করছি তার জন্য সীমাবদ্ধ ডিবি ব্যবহারকারীদের তৈরি করার চেষ্টা করছি এবং আমি পরীক্ষার জন্য যে পোস্টগ্রিজ ডাটাবেস ব্যবহারকারী ব্যবহার করছি তা ফেলে দিতে চাই। প্রথমে ম্যানুয়ালি তার সমস্ত অধিকার প্রত্যাহার করে না রেখে বা ব্যবহারকারীর সমস্ত অনুদান প্রত্যাহার করেই কি বাদ দেওয়ার কোনও উপায় আছে?

উত্তর:


144

কেমন

DROP USER <username>

এটি আসলে একটি উপাধি DROP ROLE

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

এটি সেরা দ্বারা অর্জন করা হয়

REASSIGN OWNED BY <olduser> TO <newuser>

এবং

DROP OWNED BY <olduser>

পরেরটি ব্যবহারকারীকে প্রদত্ত যে কোনও সুযোগ-সুবিধা সরিয়ে ফেলবে।

ড্রপ রোলের জন্য পোস্টগ্রিস ডক্স এবং এর আরও বিশদ বিবরণ দেখুন


যোগ:

স্পষ্টতই, এখানে উল্লিখিত কমান্ডগুলি ব্যবহার করে কোনও ব্যবহারকারীকে ফেলে দেওয়ার চেষ্টা করা কেবলমাত্র তখনই কার্যকর হবে যখন আপনি মূল গ্রান্টস তৈরি করেছিলেন একই ডাটাবেসের সাথে সংযুক্ত থাকাকালীন সেগুলি কার্যকর করা হয়:

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local


11
এরকম: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser দিলেন ত্রুটি বার্তা: ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo। যাইহোক, DROP OWNED BY testuserকৌশলটি কি স্পষ্টতই পোস্টগ্রাস অনুদানকে ড্রপযোগ্য বস্তু হিসাবে বিবেচনা করে।
মিলিমুজ

1
দয়া করে স্পষ্ট করুন, @ টিম কেন এবং মিলিমুজ: আমি প্রকৃতপক্ষে টেবিলগুলি বাদ দিতে চাই না যদি আমি পরীক্ষার্থীর কাছে খাদ্য বেছে নিই এবং তারপরে টেস্টারের দ্বারা মালিকানা থেকে সরে যাই। আমি মনে করি আপনি বলছেন যে মালিকানাধীন ড্রপ কেবল অনুদানগুলি বাদ দিচ্ছে তবে অনুদানটি যে বস্তুতে হয়েছিল তা ছাড়বে না। সঠিক?
অ্যান্ড্রু ওল্ফ

1
অ্যান্ড্রু, স্পষ্টতার জন্য ডকুমেন্টেশন পড়ার জন্য সেরা। মালিকানাধীন ড্রপ সেই ব্যবহারকারীর মালিকানাযুক্ত টেবিলগুলি ফেলে দেবে । পুনরায় স্বীকৃত বাই এই টেবিলগুলি অন্য কোনও ব্যবহারকারীর কাছে পুনরায় নিয়োগ করবে ign একটি নির্বাচন করুন.
টিম কেন

3
আপনি যদি এখনও অধিকার বজায় রাখে রিসপন্স মালিকানাধীন নিজের দ্বারা খুব বেশি পরিমাণে গ্রহণের বিষয়ে উদ্বিগ্ন হন তবে আপনি সমস্ত [টেবিলস | সিকোয়েনস | ...] স্কেম [স্কিমার নাম] [ভূমিকা] থেকে সমস্ত প্রত্যাখ্যান করতে পারেন
jla

প্রকৃতপক্ষে, ড্রপ মালিকানাধীন কমান্ডটি এর অর্থ এবং প্রভাবগুলির ক্ষেত্রে কিছুটা অস্পষ্ট। ডকটি সঠিকভাবে পেতে আমাকে সাবধানে পড়তে হয়েছিল। পোস্ট বলছি জন্য ধন্যবাদ।
সাবস্টিয়ান ক্ল্যামেন্ট

49

স্বীকৃত উত্তর দ্বারা চালিত বা চালিত মালিকানাধীন পুনরায় চেষ্টা করার সময় গ্রহণযোগ্য উত্তরের ফলে আমার জন্য ত্রুটি হয়েছিল। নিম্নলিখিত আমার জন্য কাজ করেছে:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;

ব্যবহারকারীর অন্যান্য স্কিমে বিশেষাধিকার থাকতে পারে, এক্ষেত্রে আপনাকে সঠিক স্কিমার দ্বারা প্রতিস্থাপিত "সার্বজনীন" দিয়ে যথাযথ REVOKE লাইনটি চালাতে হবে। কোনও ব্যবহারকারীর জন্য সমস্ত স্কিমা এবং সুবিধার ধরণের প্রদর্শন করতে, আমি এই ক্যোয়ারীটি তৈরি করতে \ dp কমান্ডটি সম্পাদনা করেছি:

SELECT 
  n.nspname as "Schema",
  CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
  END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';

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


12
আমাকে REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
এটিও

3
স্কিমার সুবিধাদিও।
Greatvovan

2
স্কিমা সুবিধার জন্য:revoke USAGE on SCHEMA some_schema from username;
আলফায়া

আমি এটি চেষ্টা করেছিলাম কিন্তু সমস্যাটি আমার ক্ষেত্রে অব্যাহত রয়েছে। আমি এটিকে পৃথক প্রশ্ন হিসাবে স্ট্যাকওভারফ্লো
এন্ড্রুস

17

এছাড়াও খেয়াল করুন, যদি আপনি স্পষ্টভাবে মঞ্জুর করেছেন:

CONNECT ON DATABASE xxx TO GROUP ,

আপনার নিজের দ্বারা ড্রপ মালিকানা থেকে পৃথক করে প্রত্যাহার করতে হবে:

REVOKE CONNECT ON DATABASE xxx FROM GROUP


আমি উপরের সমস্ত কিছু চেষ্টা করেছিলাম এবং এটি এখনও আমার পক্ষে কাজ করছে না, যতক্ষণ না আমি এই থেকে আরও কিছুটা দূরে স্ক্রোল করি, সুতরাং এখন আমার কিছু চুল বাকি আছে। কিছু. : ডি আপনাকে ধন্যবাদ !!
মিচ কেন্ট

6

প্রত্যাহার করতে আমাকে আরও একটি লাইন যুক্ত করতে হয়েছিল ...

দৌড়ানোর পরে:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;

আমি তবুও ত্রুটিটি পেয়েছিলাম: ব্যবহারকারীর নাম বাদ দেওয়া যাবে না কারণ কিছু বস্তু এটির উপর নির্ভর করে বিশদ: স্কিমা পাবলিকের জন্য সুবিধা ges

আমি এটি মিস করছি:

REVOKE USAGE ON SCHEMA public FROM username;

তখন আমি ভূমিকাটি বাদ দিতে সক্ষম হয়েছি।

DROP USER username;

আপনার যদি 'SCHEMA pg_catolog' এর জন্য সুবিধাগুলি প্রত্যাহার করতেও পারে তবে উদাহরণস্বরূপ, আপনি যদি pg_rewind এর জন্য এমন একটি ব্যবহারকারী তৈরি করেছেন যা pg_read_binary_file এর মতো ফাংশনগুলির উপর বিশেষাধিকার রাখে।
গ্রিনরাইপার

5

অবশেষে আমার জন্য কী কাজ করেছে তা এখানে:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;

2

নেই REVOKE ALL PRIVILEGES ON ALL VIEWS, তাই আমি এখানে দিয়ে শেষ করেছি:

do $$
DECLARE r record;
begin
  for r in select * from pg_views where schemaname = 'myschem'
  loop
    execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
  end loop;
end $$;

এবং স্বাভাবিক:

REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";

নিম্নলিখিতটি সফল হওয়ার জন্য:

drop role "XUSER";

0

কমান্ডলাইনে, পোস্টগ্রাস dropuserথেকে ড্রপ ব্যবহারকারীদের করার জন্য একটি কমান্ড পাওয়া যায়।

$ dropuser someuser

-19

আমি একই সমস্যার মুখোমুখি হয়েছি এবং এখন এটি সমাধানের একটি উপায় খুঁজে পেয়েছি। প্রথমে আপনি যে ব্যবহারকারীর ড্রপ করতে চান তার ডাটাবেস মুছতে হবে। তারপরে ব্যবহারকারীকে সহজেই মুছে ফেলা যায়।

আমি "এমএসএফ" নামে একটি ব্যবহারকারী তৈরি করেছি এবং ব্যবহারকারীকে মুছতে এবং এটি পুনরায় তৈরি করতে কিছুক্ষণ লড়াই করেছি। আমি নীচের পদক্ষেপগুলি অনুসরণ করেছি এবং পেয়েছি সফল।

1) ডাটাবেস ড্রপ

dropdb msf

2) ব্যবহারকারীর ড্রপ

dropuser msf

এখন আমি ব্যবহারকারীর সাফল্যের সাথে বাদ পড়েছি।


2
এটি একটি অবিশ্বাস্যভাবে স্ল্যাশ এবং বার্ন পদ্ধতির, যেহেতু আমার কাজের প্রতিটি পুনরাবৃত্তির জন্য আমাকে ডাটাবেস স্কিমাটি পুনরায় তৈরি করতে হবে। (যার মধ্যে বিদ্যমান ডাটাবেস স্কিমাটিতে সূক্ষ্ম অনুমতি থাকা জড়িত; যেমন ডাটাবেস স্কিমাটি অপরিবর্তিত থাকে তবে এটি সেরা))
মিলিমুজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.