زمانی که ادمین دیتابیس، User جدیدی را برای Developerها ایجاد می کند شاید در تردید باشد که چه مجوزهایی را به این User اهدا کند تا Developer حداقل دسترسی لازم برای تولید Application را در نقطه شروع داشته باشد.
شاید بسیاری از ادمینها، Roleهای Connect و Resource را به این User اهدا می کنند تا Developer بتواند از طریق این User به دیتابیس وصل شده و در صورت لزوم اقداماتی را نظیر ساخت Table، View، Trigger و … انجام دهد.
این دو Role شامل system privilegeهای زیر هستند:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> create user usef identified by a; User created. SQL> grant connect,resource to usef; Grant succeeded. SQL> conn usef/a@target:1521/PDBTARGET Connected.
SQL> select * from session_privs; CREATE SESSION CREATE TABLE CREATE CLUSTER CREATE SEQUENCE CREATE PROCEDURE CREATE TRIGGER CREATE TYPE CREATE OPERATOR CREATE INDEXTYPE SET CONTAINER 10 rows selected.
البته در اوراکل 12c برای نقش Resource تغییر مهمی اتفاق افتاد، که آن هم گرفتن دسترسی Unlimited Tablespace از این نقش بود با این تغییر، کاربری که صرفا دارای مجوز resource باشد نمی تواند segmentای را ایجاد کند. همچنین در این نسخه و با آمدن containerها، مجوز set container هم به connect اضافه شد که البته برای Local Userها کاربردی ندارد.
در نسخه های بعدی و تا قبل از 23c تغییر خاصی در تعداد مجوزهای این دو Role ایجاد نشد ولی در 23c تعداد مجوزهای نقش resource از 8 به 17 افزایش پیدا کرده است:
Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release SQL> create user usef identified by a; User created. SQL> grant connect,resource to usef; Grant succeeded. SQL> connect usef/a@target:1521/pdb1 Connected.
SQL> select * from session_privs; CREATE PROPERTY GRAPH CREATE ANALYTIC VIEW CREATE HIERARCHY CREATE ATTRIBUTE DIMENSION SET CONTAINER CREATE INDEXTYPE CREATE OPERATOR CREATE TYPE CREATE MATERIALIZED VIEW CREATE TRIGGER CREATE PROCEDURE CREATE SEQUENCE CREATE VIEW CREATE SYNONYM CREATE CLUSTER CREATE TABLE CREATE SESSION 17 rows selected.
در نسخه 23c، اوراکل Role جدیدی به نام DB_DEVELOPER_ROLE را معرفی کرده است که می تواند جایگزین مناسبی برای connect و resource باشد چرا که DB_DEVELOPER_ROLE مجوزهای مهم این دو Role را دارد و می تواند برای شروع کار Developerها مناسب باشد.
اگر DB_DEVELOPER_ROLE را به کاربری اهدا کنیم، کاربر دارای system privilegeهای زیر خواهد بود:
SQL> create user usef identified by a; User created. SQL> grant DB_DEVELOPER_ROLE to usef; Grant succeeded. SQL> connect usef/a@target:1521/pdb1 Connected.
SQL> select * from session_privs; CREATE DOMAIN CREATE MLE CREATE ANALYTIC VIEW CREATE HIERARCHY CREATE ATTRIBUTE DIMENSION EXECUTE DYNAMIC MLE CREATE CUBE BUILD PROCESS CREATE CUBE CREATE CUBE DIMENSION CREATE MINING MODEL CREATE JOB DEBUG CONNECT SESSION ON COMMIT REFRESH CREATE DIMENSION CREATE TYPE CREATE MATERIALIZED VIEW CREATE TRIGGER CREATE PROCEDURE FORCE TRANSACTION CREATE SEQUENCE CREATE VIEW CREATE SYNONYM CREATE TABLE CREATE SESSION 24 rows selected.
همچنین Roleها و object privilegeهای زیر هم به این کاربر اهدا خواهند شد:
SQL> SELECT * FROM DBA_ROLE_PRIVS n WHERE n.grantee=’DB_DEVELOPER_ROLE’;
SQL> SELECT * FROM DBA_TAB_PRIVS WHERE grantee=’DB_DEVELOPER_ROLE’;
البته ایجاد segment کماکان نیاز به دستور جدایی دارد که می تواند از طریق alter user quota و یا unlimited tablespace به کاربران اهدا شود.
SQL> create table tb as select * from dual; ORA-01950: The object owner 'USEF' has insufficient quota on tablespace 'SYSTEM'.
امکان کم کردن مجوزهای فوق از DB_DEVELOPER_ROLE در سطح یک PDB وجود ندارد و برای سلب مجوزی از این ROLE باید به root container متصل شد:
SQL> show con_name CON_NAME ------------------ TEHRANPDB SQL> revoke CREATE VIEW from DB_DEVELOPER_ROLE; ORA-65092: system privilege granted with a different scope to 'DB_DEVELOPER_ROLE' SQL> show con_name CON_NAME ----------------- CDB$ROOT SQL> revoke CREATE VIEW from DB_DEVELOPER_ROLE container=all; Revoke succeeded.
صرف نظر از مجوزهای فوق، در سطح PDB می توان به این ROLE مجوز جدیدی را اهدا کرد و در صورت لزوم این مجوز جدید را revoke کرد:
SQL> show con_name CON_NAME ------------------ TEHRANPDB SQL> grant select any table to DB_DEVELOPER_ROLE; Grant succeeded. SQL> SELECT PRIVILEGE FROM DBA_SYS_PRIVS WHERE grantee='DB_DEVELOPER_ROLE' and PRIVILEGE like 'SELECT%'; PRIVILEGE -------------------- SELECT ANY TABLE SQL> revoke SELECT ANY TABLE from DB_DEVELOPER_ROLE; Revoke succeeded.