یکی
از ویژگی های جالب در نسخه 12.2، قابلیت Lockdown profile است. فرض کنید
قرار است تا یک PDB را از دیتابیس اصلی clone بگیرید و به طور کامل به تیم
توسعه تحویل دهید. پس لازم است تا دسترسی DBA را هم به تیم توسعه بدهید.
این دسترسی ممکن است منجر به مشکلاتی در سیستم شود، مثلاً ممکن است با
استفاده از utl_file فایل های زیادی در سیستم عامل تولید کنند، از قابلیتی
استفاده کنند که لایسنس آن را نداریم و ...
صورت مسئله این است که چگونه می توانیم مطمئن شویم که کارهای تیم توسعه برای ما دردسری ایجاد نخواهد کرد؟
پاسخ این سوال، استفاده از قابلیت Lockdown Profile است که در نسخه 12.2 معرفی شد.
حالا به بررسی این قابلیت می پردازیم:
در ابتدا به CDB متصل می شویم و یک profile برای local DBA (کاربر DBA تیم توسعه در PDB خودشان) می سازیم:
SQL> create lockdown profile My_Profile;
Lockdown Profile created.
SQL> select profile_name,status from dba_lockdown_profiles;
PROFILE_NAME STATUS
------------------------------ -------
MY_PROFILE EMPTY
PRIVATE_DBAAS EMPTY
PUBLIC_DBAAS EMPTY
SAAS EMPTY
غیرفعال کردن قابلیت های دیتابیس
فرض
کنید می خواهیم قابلیت های partitioning و advanced queuing را برای
پروفایل ساخته شده غیرفعال کنیم پس از دستور زیر استفاده می کنیم:
SQL> alter lockdown profile MY_PROFILE disable option = ('PARTITIONING','DATABASE QUEUING');
Lockdown Profile altered.
SQL> select RULE_TYPE,RULE,STATUS from dba_lockdown_profiles where profile_name = 'MY_PROFILE';
RULE_TYPE RULE STATUS
-------------------- -------------------- -------
OPTION DATABASE QUEUING DISABLE
OPTION PARTITIONING DISABLE
حالا می خواهیم این پروفایل را بر PDB مورد نظر (در این مثال HRPDB) اعمال کنیم:
SQL> alter session set container=hrpdb;
Session altered.
SQL> show parameter pdb_lockdown
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pdb_lockdown string
SQL> alter system set pdb_lockdown = 'MY_PROFILE';
System altered.
با اتصال به کاربر admin مربوط به PDB بررسی می کنیم تا مطمئن شویم که مثلاً قابلیت پارتیشن بندی جداول غیرفعال است:
$ sqlplus PDBADMIN@hrpdb
SQL>
create table test_tbl(id number) partition by range (id) interval (10)
(partition p1 values less than (10), partition p2 values less than
(20));
create
table test_tbl(id number) partition by range (id) interval (10)
(partition p1 values less than (10), partition p2 values less than (20))
*
ERROR at line 1:
ORA-00439: feature not enabled: Partitioning
همچنین
با استفاده از عبارت های ALL و EXCEPT میتوانیم تمام قابلیت ها را فعال یا
غیر فعال کنیم یا برای فعال سازی یک یا چند قابلیت استثنا قائل شویم. به
عنوان مثال با دستور زیر تمام قابلیت ها به غیر از Advanced Queuing را غیر
فعال می کنیم:
SQL> alter session set container=cdb$root;
Session altered.
SQL> alter lockdown profile MY_PROFILE enable option all except = ('DATABASE QUEUING');
Lockdown Profile altered.
اگر
دوباره برای ساخت جدول پارتشن شده در PDB اقدام کنیم دستور بدون خطا اجرا
خواهد شد، زیرا تمام قابلیت ها به غیر از Advanced Queuing فعال شدند:
SQL>
create table test_tbl(id number) partition by range (id) interval (10)
(partition p1 values less than (10), partition p2 values less than
(20));
Table created.
غیر فعال کردن امکان اجرای دستورات قدرتمند
فرض
کنید که لازم است برنامه نویسان بتوانند در PDB خودشان امکان kill session
داشته باشند. پس لازم است تا مجوز alter system را به آنها بدهیم ولی می
دانیم که این دستور برای خراب کردن دیتابیس کافی است! پس می خواهیم تا تنها
اجازه kill session بدهیم ولی دیگر دستورات alter system را غیر مجاز
کنیم، پس با اتصال به CDB دستورات زیر را اجرا می کنیم:
SQL> alter session set container=cdb$root;
Session altered.
SQL> alter lockdown profile MY_PROFILE disable statement = ('ALTER SYSTEM') clause all except = ('KILL SESSION');
Lockdown Profile altered.
با کاربر pdbadmin به hrpdb متصل می شویم و تست می کنیم:
$ sqlplus PDBADMIN@hrpdb
SQL> select sid,serial# from v$session where username = 'HR';
SID SERIAL#
---------- ----------
278 31669
SQL> alter system kill session '278,31669' immediate;
System altered.
SQL> alter system set optimizer_dynamic_sampling=8;
alter system set optimizer_dynamic_sampling=8
*
ERROR at line 1:
ORA-01031: insufficient privileges
همچنین
ممکن است بخواهیم تا pdbadmin تنها بتواند پارامترهای cursure_sharing و
optimizer_dynamic_sampling را تغییر بدهد. برای این کار می توانیم از
دستور زیر استفاده کنیم:
SQL> alter session set container=cdb$root;
Session altered.
SQL> alter lockdown profile MY_PROFILE disable statement = ('ALTER SYSTEM') clause = ('SET');
Lockdown Profile altered.
SQL>
alter lockdown profile MY_PROFILE enable statement = ('ALTER SYSTEM')
clause = ('SET') option =
('cursor_sharing','optimizer_dynamic_sampling');
Lockdown Profile altered.
تست می کنیم:
$ sqlplus PDBADMIN@hrpdb
SQL> alter system set open_cursors=500;
alter system set open_cursors=500
*
ERROR at line 1:
ORA-01031: insufficient privileges
SQL> alter system set session_cached_cursors=100;
alter system set session_cached_cursors=100
*
ERROR at line 1:
ORA-02096: specified initialization parameter is not modifiable with this
option
SQL> alter system set optimizer_dynamic_sampling=8;
System altered.
SQL> alter system set cursor_sharing = 'EXACT';
System altered.
غیرفعال کردن امکان اجرای پکیج های دیتابیس
فرض کنید می خوایم امکان اجرای پکیج قدرتمند utl_file را در PDB غیر ممکن کنیم، پس از دستور زیر استفاده می کنیم:
SQL> alter lockdown profile MY_PROFILE disable feature = ('UTL_FILE');