Sunday, September 6, 2015

استخدام قيم بيئة المستخدم على مستوى قاعدة البيانات.

بسم الله و الحمد لله و الصلاة و السلام على رسول الله.

مثال على  قيم بيئة المستخدم هو المتغير :

 :APP_USER
v('APP_USER')


في ابكس  يمكن استرجاع قيم بيئة المستخدم من خلال SYS_CONTEXT على مستوى قاعدة البيانات.

مثال: 


غالبا  نضيف اربع أعمدة لاي جدول  و التي هي باللون الأخضر فيما يلي:

CREATE TABLE EMP (
ID NUMBER (5),
EMP_NAME VARCHAR2 (64),
CREATED_BY VARCHAR2 (32),
UPDATED_BY VARCHAR2 (32),
CREATED DATE ,
UPDATED DATE
)

غالبا ما نقوم تاستخدام القادح التالي لادخال القيم إلى الأعمدة الأربعة:

CREATE OR REPLACE  TRIGGER EMP_ADT_TRG BEFORE
  INSERT OR UPDATE ON EMP FOR EACH ROW 
BEGIN 
  
  IF INSERTING THEN 
   :NEW.CREATED_BY := NVL( V('APP_USER'),USER );
   :NEW.CREATED := SYSDATE;
  END IF;
  
  
  IF UPDATING THEN   
    :NEW.UPDATED_BY := NVL( V('APP_USER'),USER );
    :NEW.UPDATED := SYSDATE;
  END IF;
  
END;

النقطة الأولى: في الكود السابق هي استخدام NVL و الدي يستهلك موارد أكنر من COALESCE و عليه الكود يجب أن يكون:


  :NEW.UPDATED_BY := COALESCE( v('APP_USER'),USER );


النقطة الثانية: في الكود السابق هي استخدام  
                                                                                                                 v('APP_USER')

و التي لا يمكن استخدامها كقيمة افتراضية للعمود في الجدول.


CREATE TABLE EMP (
ID NUMBER (5),
EMP_NAME VARCHAR2 (64),
CREATED_BY VARCHAR2 (32) 
default COALESCE(SYS_CONTEXT('APEX$SESSION', 'app_user'), USER),
UPDATED_BY VARCHAR2 (32),
CREATED DATE
default sysdate ,
UPDATED DATE
)

CREATE OR REPLACE TRIGGER EMP_ADT_TRG BEFORE

  UPDATE ON EMP  FOR EACH ROW
BEGIN

  :NEW.UPDATED_BY := COALESCE(SYS_CONTEXT('APEX$SESSION', 'app_user'), USER);
  :NEW.UPDATED := SYSDATE;

END;




No comments:

Post a Comment