কোন অর্থে পোস্টগ্র্যাসকিউএল চেক অবজেক্টের অনুমতি চেক করে?


16

একটি ডাটাবেস ভূমিকা দেওয়া হয়েছে user1, something()একটি সঞ্চিত পদ্ধতি হিসাবে সংজ্ঞায়িত একটি ফাংশন এবং এর মতো তৈরি একটি ভিউ:

CREATE VIEW view1 AS select * from something()

এবং, এই অনুমতিগুলি দেওয়া হয়েছে:

REVOKE ALL ON FUNCTION something FROM user1
REVOKE SELECT ON view1 FROM user1

আমি যখন দৌড়ে যাই তখন আমি SELECT * FROM view1একটি ত্রুটি পাই permission denied for function something()

আমার প্রশ্ন হ'ল আমি যদি এই দৃশ্যে নির্বাচিত অনুমতিগুলি বাতিল করি তবে ফাংশনটি কেন বলা হয়? আমি এমন কিছু পাওয়ার আশা করছিলাম:

permission denied for relation view1

ধন্যবাদ!


2
এএআইএআইএফির কোনও নির্ধারিত আদেশ নেই যেখানে অনুমতিগুলি চেক করা হয়।
ক্রেগ রিঞ্জার

@ ক্রেইগ্রিঞ্জার আপনাকে ধন্যবাদ! আমি অনুমান করি এটি তখন প্রত্যাশিত আচরণ। আমি যখন একটি এপিআই-তে মতামতটি প্রকাশ করছি, আমি দেখার বাস্তবায়নের বিশদটি প্রকাশ করা এড়াতে চেষ্টা করছিলাম (দেখার পরিবর্তে ফাংশনটির অনুমতিগুলি সম্পর্কে ত্রুটি বার্তাটি দেওয়া হয়েছে)।
সান্টিয়োস

1
আমি সন্দেহ করব যে অনুমতিগুলি একই ফ্যাশন ক্যোয়ারী পরিকল্পনাগুলিতে যেমন (যেমন নীচ থেকে উপরে) মূল্যায়ন করা হয় এবং যেমন সর্বনিম্ন অবজেক্টটি প্রথমে মূল্যায়ন করা হয় যা আপনার ক্ষেত্রে something()কাজটি। একটি দ্রুত পরীক্ষা হ'ল ক্যোয়ারীটি সংশোধন করা যাতে আপনি আলাদা ব্যাখ্যা করার পরিকল্পনা পান, সেই অনুযায়ী অনুমতিগুলি সামঞ্জস্য করে এবং তারপরে অনুমতিটি ত্রুটিটি something()ফাংশনে নিক্ষেপ করা হয়েছে কিনা তা দেখুন বা কীভাবে নতুন এক্সিকিউশন প্ল্যানটি পুনরায় মূল্যায়ন করা হচ্ছে তা অনুসরণ করে।
জন আইজব্রেনার

আপনি ফাংশন উপর অনুমতি প্রদান এবং দেখুন তাদের প্রত্যাহার, এটা অন্তর্নিহিত ফাংশন কোন উল্লেখ বাদ উচিত
amenadiel

উত্তর:


3

সেক্ষেত্রে সমস্যাটি হুবহু অনুমতি আদেশের বিষয়ে নয়, তবে কার্যকর করার আদেশের।

পুনরায় সারিতে, পোস্টগ্রিসএসকিউএল এর জন্য:

1- সারণীগুলিতে প্রবেশ করা ভিউগুলি সারণীর অনুমতিটিকে ওভাররাইড করবে

2- ভিউ অ্যাক্সেসিং ফাংশনগুলি, যাচাই করার আগে, সমস্ত ক্রিয়াকলাপের মূল্যায়ন করা দরকার - সুতরাং ভিউটিতে অ্যাক্সেস করার আগে অবশ্যই ফাংশনগুলি সম্পাদন করতে হবে, এমনকি ভিউতে নির্বাচনের অনুমতি না থাকলেও ...

কীভাবে আমরা তা প্রমাণ করতে পারি?

পোস্টগ্র্যাস্কল-এ, ব্যবহারকারীর এই অনুমতি না থাকলেও ভিউগুলি আপনাকে একটি টেবিলের মধ্যে নির্বাচন করার জন্য অনুমতি দিতে সক্ষম হয়।

উদাহরণ স্বরূপ:

create view view2 as select * from table1;
revoke all on table1 from user1;
grant select on view2 to user1; 

ব্যবহারকারী 1 হিসাবে লগ ইন করুন:

select * from table1 (permission denied) 
select * from view2 (sucess - the query executes)

ক্ষেত্রে, ব্যবহারকারী সারণী নির্বাচন করার অনুমতি না পেয়েও ভিউ 2 নির্বাচন করতে সক্ষম হবে having

কিন্তু যদি আমরা একই কাজটি একটি ফাংশন দিয়ে করি ? আচরণ একরকম নয় । 1 আসার আগে 5 সেকেন্ড অপেক্ষা করার জন্য একটি ফাংশন তৈরি করা যাক (যাতে আমরা যখন ভিউ কল করি তখন পোস্টগ্র্যাসকিএল যদি ফাংশনটি চালাচ্ছে তবে আমরা ডিবাগ করতে পারি)

CREATE OR REPLACE FUNCTION something() RETURNS integer
AS 'select 1 from pg_sleep(5);'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT; --this function will delay 5 seconds

create view view1 as select * from something();
revoke all on function something() from user1;
grant select on view1 to user1; 

ব্যবহারকারী 1 হিসাবে লগ ইন করুন:

select * from something(); (permission denied for something) 
select * from view1 (permission denied for something )

ভিউতে নির্বাচন করার অনুমতিটি ফাংশনটির অনুমতিটিকে ওভাররাইড করে না এবং সবচেয়ে খারাপ এমনকি যদি আমরা ভিউ 1 থেকে অনুমতিগুলি প্রত্যাহার করি তবে বার্তাটি এখনও দেখায় যে পোস্টগ্রেস্কল ফাংশনটির কারণে আমাদের জিজ্ঞাসাটি বন্ধ করে দিয়েছে, ভিউয়ের অনুমতি যাই হোক না কেন .. (প্রশ্নে ঠিক কী হচ্ছে)

তবে ফাংশনটি কি সত্যই প্রথম পরীক্ষা করা হচ্ছে? আমরা যদি ফাংশনে 'সমস্ত' অনুমতিগুলি দিয়ে থাকি তবে দেখার অনুমতিটি বাতিল করে ...

grant all on function something to user1; 
revoke all on view1 from user1; 
select * from view1;
Delayed 5 seconds... (the function executed!) 
Permission denied for select on view1

আপনি যেমন পোস্টগ্রেস্কেল দেখতে পাচ্ছেন 5 সেকেন্ড আগে এই বলেছিলেন যে " ভিউ (কিছু)" ফাংশন কার্যকর হয়েছে তা দেখিয়ে আমাদের ভিউ আউটপুট করার অনুমতি নেই । সুতরাং ভিউ চেক করার আগে ফাংশন ডেটা রিটার্ন উপস্থিত থাকতে হবে।

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

আমি মনে করি এটি "অনুমতি আদেশ" এর শর্তে আপনার প্রশ্নের উত্তর দেয়, তবে কেন পোস্টগ্র্যাস্কলকে চালিয়ে যাওয়ার আগে সমস্ত কার্যকারিতা মূল্যায়ন করা দরকার, তা আর একটি প্রশ্ন ...

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