الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

عمل شاشات تدقيق!!

مغلق
بدأه الأمل في 8 يونيو 2002 · 6 رد · 949 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته أخوتي و اخواني ..

أتمنى ان تكونوا في أحسن حال و أفضل صحة :)

هل يستطيع احدكم ان يرشدني لكيفية عمل شاشات تدقيق؟؟

اريد انشاء شاشات تدقيقي على جداول معينة

لمعرفة مثلا اسم الجدول الذي حدث به التغيير و من احدثه و في column و تاريخ التغيير و نوعه!

و اريد ان اعرض the new value and the old value!!

شكرا لكم و لصبركم على اسئلتي

اختكم

الأمل

#2

تحياتي للجميع

في هذه الحاله افضل استعمال الtriggers الموجوده على مستوى الtable حيث يمكنك من تخزين اي تعديل او حذف او اضافه على ال tableالمطلوب

ويتم تخزين التغييرات في ملف اخر يتم بنائه(xxx) من قبلكم لهذا الامر مثلا :

في الafter update trigger يتم عمل insert الى ملف xxx

بالقيم الold والnew بكل سهوله وضمن الشروط المطلوبه

تحياتي للجميع

;)

#3

السلام عليك ورحمة الله وبركاته

الاخت الامل المحترمه

تحياتي للاخ النبع المحترم

إضافه الى ماذكره الاخ النبع

بالنسبه لموضوع ال Auditing

يعتبر من احد دروس ومواضيع الPL/SQL لذلك لو يوجد لديكي كتب

في الPL/SQL فسوف تجدي شرح وافيا عن الAuditing .

وبشرح مبسط عن ماأعرفه عن ال Auditing , هو عباره عن Trigger يقوم بادخال بيانات على جدول .

هذا الجدول نقوم بإنشاءه بناء على حقول الجدول التي نرغب بعمل Auditing علي العمليات التى تحدث بها

وهي 3 Insert و Update وDelete .

مثال : -

اقتباس
يوجد لدينا الجدول التالي :-

CREATE TABLE TEST_TAB
(
EMP_NAME VARCHAR2(50),
EMP_NO NUMBER(6),
EMP_BIRTH_DATE DATE,
EMP_SALARY NUMBER(6)
);

ونريد ان نعمل Auditing على حقل الSalary فقط  لذلك يجب علينا

ان نقوم بإنشاء جدول كالتالي :

CREATE TABLE AUDIT_SALARY
(
MODIFY_USER VARCHAR2(50),
MODIFY_DATE DATE,
MODIFY_TYPE  VARCHAR2(20),
OLD_EMP_SALARY NUMBER(6),
NEW_EMP_SALARY NUMBER(6)
);

ومن ثم نقوم بعمل الTrigger الذي يقوم بإدخال بيانات التعديل و الحذف و الاضافه  

التى تحصل على حقل الSalary الموجود في جدول TEST_TAB كالتالي :

CREATE OR REPLACE TRIGGER AUDIT_SALARY
BEFORE INSERT OR UPDATE OR DELETE ON TEST_TAB
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO AUDIT_SALARY VALUES(USER,SYSDATE,'إدخال',NULL,:NEW.EMP_SALARY);
ELSIF DELETING THEN
INSERT INTO AUDIT_SALARY VALUES(USER,SYSDATE,'حذف',:OLD.EMP_SALARY,NULL);
ELSE
INSERT INTO AUDIT_SALARY VALUES(USER,SYSDATE,'تعديل',:OLD.EMP_SALARY
,:NEW.EMP_SALARY);
END IF;
END;

الان نقوم بعملية إدخال بيانات في جدول TEST_TAB :-

INSERT INTO TEST_TAB
VALUES('OMER',1111,'11-JAN-2002',1000);

ثم نرى ماذا حدث في جدول AUDIT_SALARY :-

SELECT * FROM AUDIT_SALARY;

سنجد ان تم إدخال البيانات التاليه :-

MODIFY_USER : إسم الشخص الذي قام بعمليه على جدول TEST_TAB .

MODIFY_DATE : تاريخ العملية التى حدثت على جدول TEST_TAB .

MODIFY_TYPE : نوع العمليه التى حدثت على جدول TEST_TAB .

OLD_EMP_SALARY : الراتب القديم  .

" هنا نلاحظ ان القيمه هي NULL لعدم وجود راتب قديم في العمليه التى حدثت وهي عمليه إدخال ".

NEW_EMP_SALARY : الراتب الجديد .

الان نقوم بعملية تعديل بيانات من جدول TEST_TAB :-

UPDATE TEST_TAB
SET EMP_SALARY = 1200;

ثم نرى ماذا حدث في جدول AUDIT_SALARY :-

SELECT * FROM AUDIT_SALARY;

سنجد ان تم إدخال البيانات التاليه :-

MODIFY_USER : إسم الشخص الذي قام بعمليه على جدول TEST_TAB .

MODIFY_DATE : تاريخ العملية التى حدثت على جدول TEST_TAB .

MODIFY_TYPE : نوع العمليه التى حدثت على جدول TEST_TAB .

OLD_EMP_SALARY : الراتب القديم  .

NEW_EMP_SALARY : الراتب الجديد .

الان نقوم بعملية حذف بيانات من جدول TEST_TAB :-

DELETE FROM TEST_TAB;

ثم نرى ماذا حدث في جدول AUDIT_SALARY :-

SELECT * FROM AUDIT_SALARY;

سنجد ان تم إدخال البيانات التاليه :-

MODIFY_USER : إسم الشخص الذي قام بعمليه على جدول TEST_TAB .

MODIFY_DATE : تاريخ العملية التى حدثت على جدول TEST_TAB .

MODIFY_TYPE : نوع العمليه التى حدثت على جدول TEST_TAB .

OLD_EMP_SALARY : الراتب القديم  .

NEW_EMP_SALARY : الراتب الجديد .

" هنا نلاحظ ان القيمه هي NULL لعدم وجود راتب جديد في العمليه التى حدثت وهي عمليه حذف ".

- الان يمكننا عمل شاشات تدقيق عن طريق الForms Builder

تقوم بعرض بيانات جدول AUDIT_SALARY .

أرجوا ان أكون قد وفقت في شرح موضوع الAuditing بطريقه مبسطه وسهله الفهم .

عمر باعقيل

المدينه المنوره

baaqeel@msn.com

#4

السلام عليكم

كيف حال الشباب مشكورين على الجهد الرائع ،وزيادة الخير خيرين هذه فكره أخرى لموضوع ال auditing .

1-انشاء جدول وليكن اسمه audit_op يحتوي على الأعمدة التالية

create table audit_op(

username varchar2(15),

operation varchar2(15),

d_date   date,

t_time varchar2(15),

t_table varchar2(15)

)

2-إنشاء proceduer كالتالي

Create or replace procedure audit_pro (op_type in 

varchar2,tname in varchar2)
is

BEGIN

insert into audit_op

(username,operation,d_date,t_time,t_table)

values (user,op_type,sysdate,to_char

(sysdate,'hh:mi:ss'),tname);

END;

3-عند بناء النموذج يمكن ان نقوم بنداء هذا ال procedure لو افترضنا اننا وضعناه في post_insert على مستوى ال emp block يكون التعامل معه كالتالي

audit_pro('insert','emp')

ونفس العملية مع اي جدول آخر

 

audit_pro('insert','dept');

ملاحظة

نجد ان ال parameters التي نرسلها لل procedure هي عبارة عن اسم الجدول و العملية .

وهكذا بالنسبة لل update وال delete من فوائد هذا ال procedure

1-إمكانية وضعه في اي مكان على مستوى form ,block,item .

2- عدم الحاجة إلى انشاء trigger لكل جدول نريد ان نعمل له auditing

تحياتي للجميع

#5

تحياتي للجميع

والله يا شباب انكم بركه

يا شنقيطي وانت يا باعقيل تراكم من خيرة الشباب

اللي تحب تفيد وتستفيد....

الله يجزيكم كل الخير

اخي باعقيل

احب ان انوه هنا لو فرضنا ان قاعدة البيانات تتكون من 100 ملف او اكثر

هل سيقوم المبرمج بكتابة كل هذه الtriggers على الtables

صعب شوي لكن مش مستحيل

فكرة الشنقيطي اظن انها لا تحتفظ بالقيم القديمه او الجديده

وهذا يجعلها محدودة الفائده... وما في داعي نخل الforms

تدخل بالموضوع... لان لو تم اي تعديل او اضافه او حذف من الsql

لا تاخذ بعين الاعتبار

الفكره اللي عندي هي بناء procedure يقوم بانشاء الtriggers لاي table في قاعدة البيانات عند الطلب منه ويخزن القيم القديمه والجديده

في table الaudit

يعني لما تعمل create لemp تنفذ بعده باشره procedure

create_mytriggers('emp'); ok

والذي بدوره ينشأ هذه الtriggers

وانا حاليا اقوم بتجربتها على قاعدة البيانات عندنا

وشكرا للتفاعل

وسلامتكم

;)

#6

السلام عليكم

شكرا أخي النبع على الملاحظة الخاصة بال SQL صحيح كلامك هي فكره بس تتجاهل العمليات خارج ال FORMS وهذا ممايجعلها محدوده شويه ،بالنسبة للفكرة ال PROCEDURE فكرة ممتازة وعجبتني كثير وراح احاول تطبيقها إذا وصلت لحاجة اعطيني خبر وجزاك الله خير وجميع الأخوان في المنتدى ....:) :)

أخوك محمد الشنقيطي

#7

مشكورييييييييييين جميعا أخواني ..

جزاكم الله كل الخير فردا فردا ..

إن شاء الله نرد لكم هالجميل يارب ..

و إن شاء الله تعم الفائدة للجميع و يتطور هالمنتدى الرائع للأحسن و يكون في القمة ..

:)

اتت في بالي فكرة و سأحاول تجربتها و تمنى أن تنجح! :rolleyes:

افكر بدل من أن نقوم ببناء trigger لكل table أن نقوم بأنشاء table يحتوي مثلا على الأتي:

tabel name

field name

old value

new value

modified user

modified time

modification type

بصراحة لا ادري إن كان بالأمكان قراءة اسم الcolumn و الtable!!

توني في بدايتي .. احتاج اقرا زيادة علشان اطبق هالشي ..

إذا فكرتي خطأ ياليت تخبروني .. :)

لكن في الوقت الحالي بطبق اللي قاله الأخ baaqeel جزاه الله كل خير ..

و الفكرة اللي قلتها بحاول فيها

تسلموون كلكم

اختكم

الأمل

هذا الموضوع مغلق.

مواضيع مشابهة