ما رأيكم بالتالي :
لديك حوالي 100 مستخدم جديد نريد إنشاءهم
، ثم منح صلاحيات إنشاء الجدوال و المشاهد للجميع ، فالسؤال كم سطراً من
التعلميات تحتاج ؟ و في الجهة الأخرى إذا أردت سحب صلاحية معينة من هؤلاء
المئة فكم سطراً أخر ستكتب من أجل ذلك ؟ و هل أنت متأكد من أنك لم تنسى أي
مستخدم ؟؟
الحل : مجموعة السماحيات Rols .
إذاً
Role هي مجموع السماحيات المختلفة التي نود إسنادها فيما بعد إلى مستخدم
واحد أو أكثر أو حتى إلى مجموعة سماحيات أخرى .
تتميز role
بسهولة إستخدامها المرة تلو الأخرى بحيث يتم إسنادها إلى المستخدم و سحبها
منه ، كما أن سحب الصلاحية من role تؤدي إلى سحبها من المستخدم الذي أسندنا
له تلك role . يمكن أن تسند أكثر من role إلى مستخدم ما ، كما يمكنك اسناد
role واحدة إلى أكثر من مستخدم .
تعليمة إنشاء role :
لديك حوالي 100 مستخدم جديد نريد إنشاءهم
، ثم منح صلاحيات إنشاء الجدوال و المشاهد للجميع ، فالسؤال كم سطراً من
التعلميات تحتاج ؟ و في الجهة الأخرى إذا أردت سحب صلاحية معينة من هؤلاء
المئة فكم سطراً أخر ستكتب من أجل ذلك ؟ و هل أنت متأكد من أنك لم تنسى أي
مستخدم ؟؟
الحل : مجموعة السماحيات Rols .
إذاً
Role هي مجموع السماحيات المختلفة التي نود إسنادها فيما بعد إلى مستخدم
واحد أو أكثر أو حتى إلى مجموعة سماحيات أخرى .
تتميز role
بسهولة إستخدامها المرة تلو الأخرى بحيث يتم إسنادها إلى المستخدم و سحبها
منه ، كما أن سحب الصلاحية من role تؤدي إلى سحبها من المستخدم الذي أسندنا
له تلك role . يمكن أن تسند أكثر من role إلى مستخدم ما ، كما يمكنك اسناد
role واحدة إلى أكثر من مستخدم .
تعليمة إنشاء role :
كود
SQL>
create role arabteam_role;
Role created.
create role arabteam_role;
Role created.
بشكل عام :
كود
CREATE
ROLE role [NOT IDENTIFIED | IDENTIFIED
{BY password | EXTERNALLY |
GLOBALLY | USING package}]
ROLE role [NOT IDENTIFIED | IDENTIFIED
{BY password | EXTERNALLY |
GLOBALLY | USING package}]
-
ماذا لو أردنا منح role مشروطة لمستخدم ما ؟ أي يجب عليه كتابة كلمة سر
لتمكين هذه role ؟؟
كود
SQL> create role arabteam_role
identified
by arabteam_pass;
Role created.
identified
by arabteam_pass;
Role created.
ماذا لو أردنا مصادقة نظام التشغيل ( كما فعلنا
مع المستخدمين ) لتمكين role ؟
كود
SQL> create role arabteam_role
identified
Externally;
identified
Externally;
كيف نسند السماحيات إلى role ؟
بالطريقة
نفسها التي أسندنا فيها السماحيات للمستخدمين :
كود
SQL>
grant create table to arabteam_role;
Grant succeeded
grant create table to arabteam_role;
Grant succeeded
الآن كيف نسند role إلى
المستخدمين ؟
كود
SQL> grant arabteam_role to arabteam;
Grant
succeeded
Grant
succeeded
حتى أننا
نستطيع إسناد role إلى أخرى ، فتصبح الثانية تحوي صلاحيات الأولى :
كود
SQL>
grant arabteam_role1 to arabteam_rol2;
Grant succeeded
grant arabteam_role1 to arabteam_rol2;
Grant succeeded
بشكل عام :
كود
GRANT
role [, role ]...
TO {user|role|PUBLIC}
[, {user|role|PUBLIC}
]...
[WITH ADMIN OPTION]
role [, role ]...
TO {user|role|PUBLIC}
[, {user|role|PUBLIC}
]...
[WITH ADMIN OPTION]
تمكين و إلغاء تمكين Roles :
يستطيع
المستخدم arabteam أن يفعل أو يلغي عمل role معينة قام مدير القاعدة أو أي
مستخدم آخر بإسنادها إليه . قد يسأل البعض: أي مجنون يلغي صلاحيات ممنوحة
إليه ؟؟؟
الجواب سيدركه مطوري التطبيقات أكثر من غيرهم : في التطبيقات
قد يتشارك الموظفون اسم مستخدم واحد لإستعمال التطبيق ، و لكن نريد فرض
مستويات من الحماية على مستوى السمتخدم الواحد ، أي قد نسمح لموظف (س)
بسماحيات أكثر من الموظف (ع) رغم أن الإثنين يقومان بتسجيل الدخول
بالمستخدم arabteam .
أرجو أن الفكرة قد وصلت .
كيف نستطيع التفعيل
:
بإستخدام التعليمة set :
كود
Set role arabteam_role;
ماذا لو أراد المستخدم أن يفعل role مشروطة
بكلمة سر ؟؟
كود
set role arabteam_role identified by
arabteam_pass;
arabteam_pass;
ماذا لو
أراد المستخدم تفعيل جميع roles التي يملكها ماعدا role معينة ؟
كود
set
role all except arabteam_role;
role all except arabteam_role;
لمطوري التطبيقات :
هناك
dbms_session.set_role لتمكين role معينة ، و لكن إنتبه فلا يمكنك استعمال
في PL/SQL Stored Procedure بل نستطيع إستعمالها فقط عن طريق Anonymous
block أو عن طريق TRIGGER على مستوى الفورم .
أي
:
كود
SQL> begin
2
dbms_session.set_role('arabteam_role');
3 end;
4 /
PL/SQL
procedure successfully completed.
2
dbms_session.set_role('arabteam_role');
3 end;
4 /
PL/SQL
procedure successfully completed.
إنظر
إلى التالي:
كود
SQL> create or replace procedure set_proc
2
is
3 begin
4 dbms_session.set_role('role1');
5 end;
6 /
Procedure
created.
SQL> execute set_proc;
BEGIN set_proc; END;
*
ERROR
at line 1:
ORA-06565: cannot execute SET ROLE from within stored
procedure
ORA-06512: at "SYS.DBMS_SESSION", line 124
ORA-06512: at
"SYSTEM.SET_PROC", line 4
ORA-06512: at line 1
2
is
3 begin
4 dbms_session.set_role('role1');
5 end;
6 /
Procedure
created.
SQL> execute set_proc;
BEGIN set_proc; END;
*
ERROR
at line 1:
ORA-06565: cannot execute SET ROLE from within stored
procedure
ORA-06512: at "SYS.DBMS_SESSION", line 124
ORA-06512: at
"SYSTEM.SET_PROC", line 4
ORA-06512: at line 1
أرجو أن الفكرة قد وصلت .
ماذا لو أردنا
إنشاء role لا يمكن تفعيلها إلا عن طريق تنفيذ package معينة ؟؟؟؟
ننشىء
role خاصة نسميها Application Role بالطريقة التالية :
كود
create
role arabteam_approle
identified using arabteam.SetRole_package;
role arabteam_approle
identified using arabteam.SetRole_package;
ملاحظة هامة جداً : كل عمليات set التي تجريها
سوف يتم التراجع عنها عند تسجيل الخروج بحيث تعود مجموعة السماحيات
الإفتراضية التي يتم إسنادها بالشكل :
كود
SQL>
alter user arabteam
2 default role arabteam_role;
User
altered.
alter user arabteam
2 default role arabteam_role;
User
altered.
- يتم سحب
الصلاحية من role بنفس الطريقة التي إستعملناها مع user :
كود
revoke
create table from arabteam_role;
create table from arabteam_role;
-
حذف الصلاحية يتم بالتعليمة التالية :
كود
drop
role arabteam_role;
role arabteam_role;
أخيراً
: توجد مجموع من Roles التي يتم إنشاءها إفتراضياً مع تنصيب أوراكل :
1-
CONNECt : للتوافقية مع الإصدارات المختلفة من الأوراكل سيرفر و تضم
صلاحية واحدة فقط هي create session >
2- Resource : و هي role قوية
تضمن صلاحيات تتيح للمستخدم إنشاء جداوله بأي مساحة على أي table space
بالإضافة إلى مميزات أخرى . في رأيي إن هذه role تمنح للمستخدمين المميزين
في القاعدة . تحوي هذه role على :
كود
CREATE
SESSION
UNLIMITED TABLESPACE
SESSION
UNLIMITED TABLESPACE
بالإضافة
إلى سماحيات إنشاء الجدوال و المشاهد و إجرائيات PL/SQL ....
3- dba :
و هي role الشهيرة جداً و هي تحوي جميع السماحيات التي تجعل من المستخدم
"معلم الداتا بيس " أو المستخدم الذي لا يخضع إلا للمستخدم sys . هذه role
خطيرة جداً فهي تجعل المستخدم قادراً على كل شيء في القاعدة حتى عملية
التخريب المقصودة أو غير المقصودة و في العادة لا تمنح هذه role إلا لشخص و
احد فقط و هي مدير القاعدة الرئيسي أما البقية فيتم منحهم أجزاء من هذه
role . تحوي هذه role على السماحيات التالية :
كود
ADVISOR
,AUDIT ANY ,DROP USER ,RESUMABLE ,ALTER USER , CREATE JOB , ANALYZE ANY ,
BECOME USER , CREATE ROLE , CREATE RULE , CREATE TYPE , CREATE USER ,
CREATE VIEW , ALTER SYSTEM , AUDIT SYSTEM , CREATE TABLE , DROP PROFILE
,ALTER PROFILE , ALTER SESSION , DROP ANY ROLE,
DROP ANY RULE,DROP
ANY TYPE,DROP ANY VIEW ,QUERY REWRITE ,ALTER ANY ROLE , ALTER ANY RULE ,
ALTER ANY TYPE , ALTER DATABASE , CREATE ANY JOB , CREATE CLUSTER ,
CREATE LIBRARY , CREATE PROFILE , CREATE SESSION , CREATE SYNONYM ,
CREATE TRIGGER , DROP ANY INDEX , DROP ANY TABLE , GRANT ANY ROLE , LOCK
ANY TABLE ,UNDER ANY TYPE ,UNDER ANY VIEW ,ALTER ANY INDEX , ALTER ANY
TABLE , CREATE ANY RULE , CREATE ANY TYPE ,CREATE ANY VIEW ,CREATE
OPERATOR ,CREATE RULE SET ,CREATE SEQUENCE ,DROP TABLESPACE , UNDER ANY
TABLE ,ALTER TABLESPACE ,BACKUP ANY TABLE ,CREATE ANY INDEX , CREATE ANY
TABLE , CREATE DIMENSION
CREATE INDEXTYPE ,CREATE PROCEDURE ,DELETE
ANY TABLE ,DROP ANY CLUSTER ,DROP ANY CONTEXT ,DROP ANY LIBRARY ,DROP
ANY OUTLINE ,DROP ANY SYNONYM ,DROP ANY TRIGGER ,EXECUTE ANY RULE
,EXECUTE ANY TYPE ,INSERT ANY TABLE ,MANAGE ANY QUEUE ,MANAGE SCHEDULER
,SELECT ANY TABLE ,UPDATE ANY TABLE ,ALTER ANY CLUSTER ,ALTER ANY
LIBRARY ,ALTER ANY OUTLINE ,ALTER ANY TRIGGER ,COMMENT ANY TABLE ,CREATE
TABLESPACE
DEQUEUE ANY QUEUE ,DROP ANY OPERATOR ,DROP ANY RULE SET
,DROP ANY SEQUENCE ,ENQUEUE ANY QUEUE ,EXECUTE ANY CLASS ,FORCE
TRANSACTION ,MANAGE TABLESPACE ,ON COMMIT REFRESH ,ALTER ANY RULE SET
,ALTER ANY SEQUENCE,CREATE ANY CLUSTER ,CREATE ANY CONTEXT ,CREATE ANY
LIBRARY , CREATE ANY OUTLINE ,CREATE ANY SYNONYM ,CREATE ANY TRIGGER
,DROP ANY DIMENSION ,DROP ANY DIRECTORY ,DROP ANY INDEXTYPE ,DROP ANY
PROCEDURE
RESTRICTED SESSION
توجد
العديد من roles الأخرى التي سيكون الحديث حولها طويلة ...
إذا أردت
أن تعلم ما هي roles الموجودة و السماحيات على مستوى النظام التي تحويها :
كود
select
role , privilege from role_sys_privs;
role , privilege from role_sys_privs;
إذا أردت أن تعلم ما هي roles الموجودة و
السماحيات على مستوى الغرض التي تحويها :
كود
select
role , privilege from role_obj_privs;
role , privilege from role_obj_privs;
ماذا لو أراد مستخدمنا arabteam أن يعرف
ماهي الصلاحيات التي يملكها ؟
على مستوى النظام :
كود
select
* from user_sys_privs;
* from user_sys_privs;
على
مستوى الأغراض :
كود
select * from user_obj_privs;
و هكذا انتهى القسم الخاص بــroles .
في
القسم القادم إن شاء الله سنتحدث عن إدارة الموارد
Resource Manage
و كيفية
توزيعها بالشكل الأمثل .. أرجو إذا وجدت أي ملاحظات حول طريقة شرحي أو عرض
الأفكار أو أي تعقيب على أي فقرة فلا تبخلوا علي بها .... و السلام
Tue Nov 05, 2013 6:35 am by okba als
» ترحيب بالأعضاء
Tue Nov 05, 2013 6:09 am by okba als
» برنامج يعلمك لغة الدلفي بشكل مثير
Mon Nov 04, 2013 10:53 pm by سيد برتوكول
» دليل هاتف الدلفي
Sun Nov 03, 2013 11:24 am by سيد برتوكول
» سلسلة فيبوناتشي
Sun Nov 03, 2013 11:22 am by سيد برتوكول
» كود جميل ورائع جربه واعرف بنفسك ماذا يعمل
Wed Apr 17, 2013 1:55 am by سيد برتوكول
» المبرمجون مستائون من الواجهة الرسومية لويندوز ٨ (Windows 8)(نسخة المطورين)
Thu Jun 21, 2012 10:26 pm by pc-king.dahek.net
» حزيرة للعلماء
Tue Apr 10, 2012 3:23 am by عفريت السويداء
» اسباب تجعل الكمبيوتر يعمل بشكل بطيء
Sun Mar 18, 2012 6:49 am by عفريت السويداء
» دروس المبتدئين.....الدرس الأول (تعليم القص)
Sat Mar 17, 2012 6:03 am by عفريت السويداء