পোস্টগ্রিসে একটি সারণীর জন্য অনুদানের জিজ্ঞাসা


97

পোস্টগ্রিসে কোনও বস্তুকে দেওয়া সমস্ত অনুদানকে কীভাবে জিজ্ঞাসা করতে পারি?

উদাহরণস্বরূপ আমার কাছে টেবিল "Mytable" রয়েছে:

GRANT SELECT, INSERT ON mytable TO user1
GRANT UPDATE ON mytable TO user2 

আমার কিছু দরকার যা আমাকে দেয়:

user1: SELECT, INSERT
user2: UPDATE

উত্তর:


113

আমি এটি ইতিমধ্যে খুঁজে পেয়েছি:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'

99

\z mytable পিএসকিএল থেকে আপনাকে একটি টেবিল থেকে সমস্ত অনুদান দেয় তবে আপনাকে পৃথক ব্যবহারকারীর দ্বারা বিভক্ত করতে হবে।


আপনি কি এটি সরাসরি এসকিউএল ফলক বা পিজি কমান্ড লাইন থেকে চালাবেন?
ড্যানিয়েল এল। ভ্যানডেনবোশ

4
@ ড্যানিয়েলএল.ভ্যানডেনবোশ: সমস্ত মেটা-কমান্ড, যেমন \z, পিএসকিএল-এর জন্য। এবং পিএসকিএল হ'ল পোস্টগ্রাইএসকিউএল-র কমান্ড-লাইন ইন্টারফেস।
মাইক শেরিল 'ক্যাট রিকল'

31

আপনি যদি সত্যই ব্যবহারকারীর জন্য একটি লাইন চান, আপনি গ্রান্টি অনুসারে গ্রুপ করতে পারেন (স্ট্রিং_এজি জন্য পিজি 9 + প্রয়োজন)

SELECT grantee, string_agg(privilege_type, ', ') AS privileges
FROM information_schema.role_table_grants 
WHERE table_name='mytable'   
GROUP BY grantee;

এটির মতো কিছু আউটপুট করা উচিত:

 grantee |   privileges   
---------+----------------
 user1   | INSERT, SELECT
 user2   | UPDATE
(2 rows)

4
প্রায় আমি যা চাই তা কি আমার কাছে GRANTপিজি_ডাম্প আউটপুটগুলির মতো সঠিক এস থাকতে পারে?
ব্রেলিওলো

28

নীচের ক্যোয়ারী আপনাকে সমস্ত ব্যবহারকারীর তালিকা এবং স্কিমে টেবিলে তাদের অনুমতি দেবে।

select a.schemaname, a.tablename, b.usename,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'select') as has_select,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'insert') as has_insert,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'update') as has_update,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'delete') as has_delete, 
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'references') as has_references 
from pg_tables a, pg_user b 
where a.schemaname = 'your_schema_name' and a.tablename='your_table_name';

আরও বিশদ এখানেhas_table_privilages পাওয়া যাবে


4
এখানে এই একমাত্র উত্তর যা অন্যান্য ভূমিকাতে সদস্যতা থেকে প্রাপ্ত অনুমতিগুলি গণনা করে, তাই এটি আমার ভোট পায়। অন্যদিকে, আমি has_table_privilege(usename, contact(schemaname, '.', tablename), ...)অস্পষ্টতা এড়াতে বলব ।
পল এ জংউথर्थ

প্লাস ওয়ান - এটি খাঁটি স্বর্ণ!
ড্যানিয়েল

9

এই কোয়েরিটি সমস্ত ডাটাবেস এবং স্কিমার সমস্ত সারণী তালিকাভুক্ত করবে ( WHEREনির্দিষ্ট ডেটাবেস, স্কিমা বা টেবিলগুলির জন্য ফিল্টার করার জন্য দফায় লাইনটি গুলি করল ), যাতে সুবিধাগুলি ক্রমান্বয়ে দেখানো হয়েছে যাতে এটি সহজে দেখা যায় কিনা একটি নির্দিষ্ট অধিকার দেওয়া হয় বা না:

SELECT grantee
      ,table_catalog
      ,table_schema
      ,table_name
      ,string_agg(privilege_type, ', ' ORDER BY privilege_type) AS privileges
FROM information_schema.role_table_grants 
WHERE grantee != 'postgres' 
--  and table_catalog = 'somedatabase' /* uncomment line to filter database */
--  and table_schema  = 'someschema'   /* uncomment line to filter schema  */
--  and table_name    = 'sometable'    /* uncomment line to filter table  */
GROUP BY 1, 2, 3, 4;

নমুনা আউটপুট:

grantee |table_catalog   |table_schema  |table_name     |privileges     |
--------|----------------|--------------|---------------|---------------|
PUBLIC  |adventure_works |pg_catalog    |pg_sequence    |SELECT         |
PUBLIC  |adventure_works |pg_catalog    |pg_sequences   |SELECT         |
PUBLIC  |adventure_works |pg_catalog    |pg_settings    |SELECT, UPDATE |
...

এটি কেবল এটির
রিকি লেভি

2

@ শ্রুতির উত্তরে যুক্ত করা হচ্ছে

প্রদত্ত ব্যবহারকারীর জন্য স্কিমাতে সমস্ত টেবিলের জন্য অনুদান জিজ্ঞাসা করা

select a.tablename, 
       b.usename, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'select') as select,
       HAS_TABLE_PRIVILEGE(usename,tablename, 'insert') as insert, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'update') as update, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'delete') as delete, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'references') as references 
from pg_tables a, 
     pg_user b 
where schemaname='your_schema_name' 
      and b.usename='your_user_name' 
order by tablename;

এটি যথাযথ অনুমতি সহ ব্যবহারকারী হিসাবে আপনাকে লগ ইন করে ধরে নিয়েই ভাল কাজ করে। নিতপিক: আমি পরামর্শ দিচ্ছি যে ক্রস জয়েন্টটি স্পষ্টভাবে লিখতে হবে, যেমন FROM pg_tables AS a CROSS JOIN pg_user AS bএসকিউএল ৯২ এর চেয়ে কমা দিয়ে এটি করার উপায়from pg_tables a, pg_user b
ডভোস

1

এখানে একটি স্ক্রিপ্ট যা একটি নির্দিষ্ট সারণীর জন্য অনুদান প্রশ্ন উত্পন্ন করে। এটি মালিকের সুবিধাদি বাদ দেয়।

SELECT 
    format (
      'GRANT %s ON TABLE %I.%I TO %I%s;',
      string_agg(tg.privilege_type, ', '),
      tg.table_schema,
      tg.table_name,
      tg.grantee,
      CASE
        WHEN tg.is_grantable = 'YES' 
        THEN ' WITH GRANT OPTION' 
        ELSE '' 
      END
    )
  FROM information_schema.role_table_grants tg
  JOIN pg_tables t ON t.schemaname = tg.table_schema AND t.tablename = tg.table_name
  WHERE
    tg.table_schema = 'myschema' AND
    tg.table_name='mytable' AND
    t.tableowner <> tg.grantee
  GROUP BY tg.table_schema, tg.table_name, tg.grantee, tg.is_grantable;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.