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

delete trigger

مغلق
بدأه the_power في 22 أغسطس 2005 · 5 رد · 845 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الغرض منه عندما يقوم احد بعمل مسح محتويات جدول معين يقوم التريجر بحفظ بياناته

* ACTION_LOG (

USER_ID INTEGER,

USER_NAME VARCHAR2(30),

ACTION VARCHAR2(30),

ACTION_DATE DATE,

SES_USERNAME VARCHAR2(30),

SES_OSUSER VARCHAR2(30),

SES_MACHINE VARCHAR2(64),

SES_TERMINAL VARCHAR2(30),

SES_PROGRAM VARCHAR2(48),

SES_CLIENT_INFO VARCHAR2(64)

);

CREATE OR REPLACE TRIGGER TRG_ABC_USER_ACTION

BEFORE INSERT OR UPDATE OR DELETE

ON ABC_USER FOR EACH ROW

DECLARE

L_ACTION ACTION_LOG.ACTION%TYPE;

BEGIN

IF ( DELETING ) THEN L_ACTION := 'DELETE'; END IF;

INSERT INTO ACTION_LOG

SELECT :OLD.USER_ID, :OLD.USER_NAME, L_ACTION,

SYSDATE, S.USERNAME, S.OSUSER, S.MACHINE,

S.TERMINAL, S.PROGRAM, S.CLIENT_INFO

FROM V$SESSION S

WHERE S.AUDSID = USERENV('SESSIONID');

END;

/

#2

ادرجت مشكلتك في احدى منتديات الاوراكل الانجليزيه .. وكان ردهم كتالي ...

اقتباس
Well, since you didn't post what the actual error was, or enough CREATE TABLEs in order to replicate properly, first thing was to create a table called ABC_USER, i.e.

SQL> CREATE TABLE abc_user ( user_id   VARCHAR2(30), user_name  VARCHAR2(30) );

Table created.

SQL> CREATE OR REPLACE TRIGGER TRG_ABC_USER_ACTION
  2  BEFORE INSERT OR UPDATE OR DELETE
  3  ON ABC_USER FOR EACH ROW
  4  
  5  DECLARE
  6  L_ACTION ACTION_LOG.ACTION%TYPE;
  7  BEGIN
  8  IF ( DELETING ) THEN L_ACTION := 'DELETE'; END IF;
  9  INSERT INTO ACTION_LOG
 10  SELECT :OLD.USER_ID, :OLD.USER_NAME, L_ACTION,
 11  SYSDATE, S.USERNAME, S.OSUSER, S.MACHINE,
 12  S.TERMINAL, S.PROGRAM, S.CLIENT_INFO
 13  FROM V$SESSION S
 14  WHERE S.AUDSID = USERENV('SESSIONID');
 15  END;
 16  /

Warning: Trigger created with compilation errors.

SQL> SHO ERR
Errors for TRIGGER TRG_ABC_USER_ACTION:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/1      PL/SQL: SQL Statement ignored
9/6      PL/SQL: ORA-00942: table or view does not exist

Next problem was that my current user didn't have select access on v_$session directly, so :

SQL> grant SELECT ON V_$SESSION TO MCHADDER;

Grant succeeded.

Then recreating the trigger is successful :

SQL> CREATE OR REPLACE TRIGGER TRG_ABC_USER_ACTION
  2  BEFORE INSERT OR UPDATE OR DELETE
  3  ON ABC_USER FOR EACH ROW
  4  
  5  DECLARE
  6  L_ACTION ACTION_LOG.ACTION%TYPE;
  7  BEGIN
  8  IF ( DELETING ) THEN L_ACTION := 'DELETE'; END IF;
  9  INSERT INTO ACTION_LOG
 10  SELECT :OLD.USER_ID, :OLD.USER_NAME, L_ACTION,
 11  SYSDATE, S.USERNAME, S.OSUSER, S.MACHINE,
 12  S.TERMINAL, S.PROGRAM, S.CLIENT_INFO
 13  FROM V$SESSION S
 14  WHERE S.AUDSID = USERENV('SESSIONID');
 15  END;
 16  /

Trigger created

ارجو ان تكون قد افادتتك ..

أشهد أن لا إله إلا الله ***************** وأشهد أن محمد عبده ورسوله

#3

شكرا لمجهودك

ولكن نفذت الامر وانظر الى الخطأ

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

SQL> CREATE TABLE ACTION_LOG (
  2    USER_ID            INTEGER,
  3    USER_NAME          VARCHAR2(100),
  4    ACTION             VARCHAR2(100),
  5    ACTION_DATE        DATE,
  6    SES_USERNAME       VARCHAR2(100),
  7    SES_OSUSER         VARCHAR2(100),
  8    SES_MACHINE        VARCHAR2(100),
  9    SES_TERMINAL       VARCHAR2(100),
 10    SES_PROGRAM        VARCHAR2(100),
 11    SES_CLIENT_INFO    VARCHAR2(100)
 12  );

Table created.

SQL> CREATE OR REPLACE TRIGGER TRG_ABC_USER_ACTION
  2     BEFORE INSERT OR UPDATE OR DELETE
  3 ON counter2005 FOR EACH ROW
  4     
  4     DECLARE
  5     L_ACTION ACTION_LOG.ACTION%TYPE;
  6     BEGIN 7     IF ( DELETING ) THEN L_ACTION := 'DELETE'; END IF;
  8     INSERT INTO ACTION_LOG 9    SELECT :OLD.USER_ID, :OLD.USER_NAME, L_ACTION,
 10    SYSDATE, S.USERNAME, S.OSUSER, S.MACHINE,
 11    S.TERMINAL, S.PROGRAM, S.CLIENT_INFO
 12    FROM V$SESSION S
 13    WHERE S.AUDSID = USERENV('SESSIONID');
 14    END;
 15  /

Warning: Trigger created with compilation errors.

SQL> sho err
buffer overflow. Use SET command to reduce ARRAYSIZE or increase MAXDATA.
No errors.
SQL> remark ----> The current user have select access on V$SESSION.

تم تعديل هذه المشاركة بواسطة walcom في 24 أغسطس 2005 في 20:46

#4

لا تضغط على زر رد سريع وانما زر اضافة رد .. وهناك ستجد خاصيه الكود .. اكتب الكود يداخلها وسيكون مرتب ..

وهل تستطيع ان توضح اكثر في مشكلتك ؟؟

أشهد أن لا إله إلا الله ***************** وأشهد أن محمد عبده ورسوله

#5

remember that you need DIRECT select access on v_$session, (not v$session which is a public synonym), also (given I can't see the error that's being generated), what's the definition of

"counter2005"?

أشهد أن لا إله إلا الله ***************** وأشهد أن محمد عبده ورسوله

#6

سلام

من جد انا مش عارف ايش اعمل ؟؟؟؟؟؟؟؟؟؟؟؟؟

شرحت انا المشكلة اللي عندي وهي مسح محتويات جداول العدادات للنظام وهي ست جداول مما يؤدي الى تعطيل النظام كامل

والمشلكة اني عملت ترجر على مستوى قاعدة البيانات لكل جدول كالاتي :-

CREATE OR REPLACE TRIGGER DEL_TEST
 BEFORE DELETE ON counter2005
  BEGIN
  RAISE_APPLICATION_ERROR(-20500,'cAN nOT dELETE.');
  END;

وجربت اعمل مسح للجدول لم يقبل المسح وكانت النتيجة كالاتي

ERROR at line 1:
ORA-20500: cAN nOT dELETE.
ORA-06512: at "SHIFA.DEL_TEST", line 2
ORA-04088: error during execution of trigger 'SHIFA.DEL_TEST'

ولكن بعد فترة تم مسح محتويات كل الجداول مرة اخرى

كيف انمسحت لا أدري

وما هي احتمالات مسح الجداول هل هو امر المسح او ممكن عمل دروب ثم انشاء من جديد لا ادري

فهل ممكن المشاركة معي لحل هذه المشكلة

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

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