الأحد، 12 يناير 2014

اوركل 12c أكثر 17 مميزات هامة للمطورين 4/17


Longer Varchar2
السلام عليكم ورحمة الله وبركاته، أهلا وسهلاً بكم في هذه التدوينة الجديدة  ومع الميزة الرابعة من الميزات الجديدة المضافة على اوركل 12c


معظمنا بل يكاد يكون كلنا تعامل مع الVarchar2  سواءً في بناء الجداول أو في بيئة PLSQL في السابق كان maximum size of varchar2 = 4000 bytes لكن مع اوركل 12c أصبح الحجم الأقصى 32676 bytes
لكن  يجب تعديل التالي:
·        MAX_STRING_SIZE يجب ان يكون EXTENDED
·        DB must be in upgrade mode
وبتالي لزيادة Maximum Size of VARCHAR2, NVARCHAR2, and RAW Columns
1.    Shut down the database.
2.    Restart the database in UPGRADE mode.
3.    Change the setting of MAX_STRING_SIZE to EXTENDED.
4.    Run the rdbms/admin/utl32k.sql script. You must be connected AS SYSDBA to run the script.
5.    Restart the database in NORMAL mode.

وصل بنا قطار العلم ان نهاية هذه المحطة، نراكم في المحطة التالية وهي  Outer Joinان كان لنا في العمر بقية. الى ذلك الوقت دمتم بحفظ الله ورعايته.


السبت، 4 يناير 2014

اوركل 12c أكثر 17 مميزات هامة للمطورين 3/17

القيمة الافتراضية للعمود/ الحقل Default Value
السلام عليكم ورحمة الله وبركاته، اليوم نستكمل مشوارنا في التعرف على أهم ميزات ذلك العملاق المدعو Oracle 12c وكما ذكرنا سابقاً بأن حديثنا سيكون موجه لمطوري قواعد البيانات وليس مدراء قواعد البيانات.


إذاً أهلاً بكم من جديد، في هذه التدوينة سنتحدث بإذن الله عن القيمة الافتراضية حيث انه يفترض كل مطوري قواعد البيانات قد تعامل مع هذه الميزة في النسخ السابقة ل12c ، لكن كانت الإمكانيات محدودة ولتوضيح الميزة الجديدة دعونا نجري السناريو التالي، افترض بأنه يوجد جدول في قاعدة بياناتك على الشاكلة التالية:
CREATE TABLE account_tb
    (
    Seq                                   NUMBER(11),
    Account_Id                            NUMBER(11,0),
    Account_name                          VARCHAR2(80),
    email                                 VARCHAR2(50),
    SSN                                   NUMBER(15,0),
    Last_dept_Dt                          DATE,
    Insert_By                             VARCHAR2(30) DEFAULT USER,
    Insert_Dt                             DATE DEFAULT SYSDATE
    )

لاحظ معي عزيزي المبرمج ان القيمة الافتراضية للعمود Insert_By  هو عبارة عن المستخدم الذي قام بعملية إضافة السجل الى الجدول في قاعدة البيانات وكذلك Insert_Dt  يأخذ التاريخ والوقت تلقائياً وذلك في حال أن السجل المدخل لا يشمل قيم لهذه الأعمدة. ولا شك ان هذه الميزة سهلت كثيراً من عمل مبرمجي ومطوري قواعد البيانات لكن ! ماذا لو اردنا ان تكون القيمة الافتراضية للعمود Seq عبارة عن  Sequanceمثلاً ما قبل 12c كان يتم ذلك من خلال انشاء Trigger  على الجدول كتالي:
CREATE OR REPLACE TRIGGER acnt_trg
 BEFORE
  INSERT
 ON account_tb
REFERENCING NEW AS NEW OLD AS OLD
 FOR EACH ROW
begin
  select MY_SEQ.NEXTVAL into :NEW.SEQ FROM DUAL;
END;
/


لكن اليوم واعتباراً من اوركل 12c أصبح بالإمكان ان يتم إضافة الSequance  في Default value  للعمود كما في التالي:
CREATE TABLE account_tb
    (seq                      NUMBER(11,0) DEFAULT MY_SEQ.NEXTVAL ,
    account_id                     NUMBER(11,0),
    account_name                   VARCHAR2(80 BYTE),
    email                          VARCHAR2(50 BYTE),
    ssn                            NUMBER(15,0),
    last_dept_dt                   DATE,
    insert_by                      VARCHAR2(30 BYTE) DEFAULT USER,
    insert_dt                      DATE DEFAULT SYSDATE)
 بتأكيد يمكنك استغلال هذه الميزة في بناء Master/Detail Relation. ولكن عزيزي المبرمج يوجد شروط بسيطة قبل استخدام هذه الميزة وهي:
1.      يجب ان تكون Sequence  المستخدمة كقيمة افتراضية منشأة مسبقاً
CREATE SEQUENCE my_seq
  INCREMENT BY 1
  START WITH 1
  MINVALUE 1
  MAXVALUE 999999999999999999999999999
  NOCYCLE
  ORDER
  NOCACHE
 يمكنك مراجعة كيفية انشاء الSequence  فهي ليست موضوع نقاشنا في هذه التدوينة.
2.      يجب منح صلاحيات على Sequence  لUsers /  Roles الذين يملكون صلاحية ادخال على الجدول.
GRANT SELECT ON my_seq TO my_role

أيضاً يمكنك أن تعطي قيمة افتراضية في حال ان القيمة المدرجة على الجدول عبارة عن NULL Values  ولتوضيح الفكرة نتابع المثال التالي:
create table pay_tb (
             seq number(11) MY_SEQ.NEXTVAL,
             acc_id NUMBER(11),
             sal_val number default on null 0
             );

 وفي حال ادراج بيانات في الجدول كما في التالي :
insert into pay_tb (acc_id,sal_val) values (1, null);
insert into pay_tb (acc_id,sal_val) values (2, 2);

تكون نتيجة المدرجة في الجدول
select *
from pay_tb;
seq       acc_id          sal_val
---------- ---------     ---------     
1           1             0
2           2             2


وصل بنا قطار العلم ان نهاية هذه المحطة، نراكم في المحطة التالية وهي Longer Varchar2 ان كان لنا في العمر بقية. الى ذلك الوقت دمتم بحفظ الله ورعايته.

اوركل 12c أكثر 17 مميزات هامة للمطورين 2/17

اخفي بياناتك الهامة من عيون المتطفلين
                                                              تقنية جديدة في أوركل 12c
تزداد أهمية البيانات يوماً بعد يوم، وأصبح أمن المعلومات والمحافظة على البيانات هاجساً يؤرق المطورين وخاصة بعد تزايد استخدام الشبكة العنكبوتية (الانترنت).



وأنت واحد من أولئك الأشخاص الذين تقع على عاتقهم جزء كبير من هذه المسئولية، لتوصيل الفكرة من هذه التدوينه أعددت هذا السيناريو، إفترض انك تعمل في تطوير نظام بنكي وبتالي فأنت بحاجة الى إخفاء بعض البيانات الحساسة عن أعين مستخدمي النظام وخاصة المتطفلين مثل آخر عملية سحب من الرصيد, وكذلك Social Security Numbers (SSN)  وأشياء كثيرة آخرى.
لتتمكن من إخفاء بعض الأعمدة من الجدول في الطريقة التقليدية القديمة تحتاج أولاً ان يكونوا مستخدمي النظام Real Users  مستخدمين حقيقين على مستوى قاعدة البيانات. ولتوصيل الفكرة بشكل مبسط تخيل معي انه يوجد جدول منشئ فعلياً على قاعدة البيانات اسمه Accounts_Tb
CREATE TABLE account_tb
    (
    Account_Id                            NUMBER(11,0),
    Account_name                          VARCHAR2(80),
    email                                 VARCHAR2(50),
    SSN                                   NUMBER(15,0),
    Last_dept_Dt                          DATE
    )

ونريد إخفاء بيانات ال SSN, Last_dept_Dt Columns , أولاً نقوم بإنشاء , View  من هذا الTable على النحو التالي:
CREATE VIEW account_vw
AS
SELECT A.Account_Id, A.Account_name, A.email
FROM   account_tb A ;

ثم نقوم بعمل CREATE public synonym لهذه الView ولكن اسمها يكون عبارة عن اسم الجدول الرئيسي المنشأ منه الView  وهو account_tb
CREATE public synonym account_tb FOR  SCHEMAX.account_vw

الان نقوم بمنح مستخدمي نظام صلاحية على هذه ال synonym والتي هي بدورها اسم الجدول الخاص بك كما هو موضح سابقاً.
grant select ON account_tb TO USERX;
grant select ON account_tb TO ROLEX;

وبتالي في حال الاستعلام من قبل USER ال USERXأو من قبل المستخدمين الذين معهم صلاحيات على ROLE ال ROLEX فإن النتيجة تكون كتالي:
SELECT *
FROM  account_tb;
الحقول/الاعمدة التي سوف تظهر للمستخدم
Account_Id| A.Account_name| A.email
تمام، تم إخفاء البيانات الحساسة من أعين متطفلي النظام. لكن ماذا لو أردنا أن نقوم بعمليات DML (Data Manipulation Language)
[Insert, Update, Delete] نحتاج الى تعديل في الview  بإضافة INSTEAD OF Trigger   يمكنك مراجعة ذلك ان لم يكن عندك معلومات كافية عن ذلك لأنه ليس موضوع مقالنا.
لكن مهلاً، يبدو ان ذلك مرهقاً لك كمبرمج قواعد بيانات، إذاً ما الحل في إخفاء البيانات الحساسة ؟
لا تقلق عزيزي المطور يوجد ميزة جديدة في Oracle 12c  للقيام بهذه المهمة دون حاجة الى الجهد البرمجي وذلك كتالي:
مرحلة انشاء الTable
CREATE TABLE account_tb
    (
    Account_Id                            NUMBER(11,0),
    Account_name                          VARCHAR2(80),
    email                                 VARCHAR2(50) invisible,
    SSN                                   NUMBER(15,0) invisible,
    Last_dept_Dt                          DATE
       )



وبتالي عند عمل Select   فإن الاعمدة/ الحقول المخفية عن أعين مستخدمي النظام لا تظهر، ووبهذا تكون قد أخفيت بياتك الحساسة دون أدني جهد منك.
SELECT *
FROM  account_tb;
الحقول/الاعمدة التي سوف تظهر للمستخدم
Account_Id| A.Account_name| A.email

ادخال البيانات:
insert into account_tb(1,'test','test@palsoft.blogspot.com');


وصل بنا قطار العلم ان نهاية هذه المحطة، نراكم في المحطة التالية وهي Default Values ان كان لنا في العمر بقية. الى ذلك الوقت دمتم بحفظ الله ورعايته.

الجمعة، 3 يناير 2014

اوركل 12c أكثر 17 مميزات هامة للمطورين 1/17


بسم الله الرحمن الرحيم
سؤال يتكرر كثيراً عند مبرمجي/ مطوري  قواعد البيانات، ما الميزات الجديد التي تحفزني للانتقال الى Oracle 12c بالرغم من أن نظامي مستقر ولا يوجد مشاكل ويؤدي ما علية من واجبات.


Oracle Database 12c

في هذة التدوينة، ان شاء الله سأتناول 17 ميزة جديدة تم اضافتها الى  Oracle 12c وخاصة بالمطورين. ففي هذة التدوينة سأوجه حديثي الى المطورين وليس مدراء قواعد البيانات.

في كل تدوينة سأتحدث عن أحد هذة الميزات 17 وذلك بشيئ من التفصيل.

إذاً أهلاً بك عزيزي مطور قواعد البيانات في هذة المقالة القصيرة التي تعطيك بعض المعلومات الهامة عن الامكانيات الهائلة لذلك العملاق القادم من شركة أوركل 12c. فلنبدأ على بركة الله 

Cascading Truncate

معظم Tables في قواعد البيانات مبنية على فكرة Master/Details، ومن المعروف انه عند بناء الTables يوجد خيار On Delete Cascade وفي هذا الخيار يتم حذف سجلات الأبناء في حال حذف سجل الأب الرئيسي.

لكن مهلاً ماذا لو أردنا استخدام Truncate لمسح بيانات الMaster Table، بالتأكيد لا يمكننا ذلك في النسخ السابقة وسوف يظهر لنا الخطأ التالي:

line 1: ORA-02266: توجد مفاتيح ربط فعالة تشير إلى المفاتيح الأساسية/الفريدة في الجدول
 ORA-02266: unique/primary keys in table referenced by enabled foreign keys 

لكن الاأمر الأن اختلف من 12c يمكنك أن تستخدم التالي:
truncate table cascade;
لكن يجب ان تكون معرف الخيار التالي:
Foreign Key  as ON DELETE  CASCADE


ALTER TABLE <Detail_Table> ADD CONSTRAINT <Const_name > FOREIGN KEY (<Col_name> ) REFERENCES <Master_table (<Col_name>)  > ON DELETE CASCADE
في حال عدم تفعيل هذا الخيار ستكون النتيجة كتالي:
ORA-14705: unique or primary keys referenced by enabled foreign keys in table

في التدوينة القادمة سأتحدث بإذن الله عن  Invisible Column.

فإلى ذلك الحين أتركم في حفظ الله ورعايته والسلام عليكم ورحمة الله وبركاته.