الانتقال إلى المحتوى

لدي مشكلة بالتريجر


Syrian Oracle

Recommended Posts

السلام عليكم
أرجو منكم المساعدة في تعديل التريجر ، فعندما اقوم بعمل create فانه لا يظهر اي اخطاء او تحذيرات .
ولكن عندما اقوم بعملية ادخال حسب الشروط الموجودةفانه يعطينا رسالة الخطأ التالية :


Database error number 1 has occurred when operating on WOSTATUS WOSTATUSID=11,587.
ORA-00001: unique constraint (MAXIMO.TKSTATUS_NDX) violated
ORA-06512: at "MAXIMO.SR_STATUS", line 24
ORA-04088: error during execution of trigger 'MAXIMO.SR_STATUS

'




[left]CREATE OR REPLACE TRIGGER SR_STATUS
AFTER INSERT ON WOSTATUS  
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
----------------------
DECLARE
CURSOR WO_CUR IS
SELECT WONUM, STATUS, ORIGRECORDID
FROM WORKORDER WHERE ORIGRECORDID = (SELECT ORIGRECORDID FROM WORKORDER WHERE WONUM =:NEW.WONUM) ;
v1 number(2) ;
o1 number(10) ;
--X1 NUMBER(10) ;
--------------------------------
BEGIN --select TKSTATUSSEQ.nextval INTO X1 FROM DUAL ;
--------------------------
SELECT count(distinct STATUS)
INTO v1 FROM WORKORDER
WHERE ORIGRECORDID = (SELECT ORIGRECORDID FROM WORKORDER WHERE WONUM = :new.wonum) ;
----------------------------------
--select ORIGRECORDID into o1 from workorder where wonum = :NEW.WONUM ;
---------------------------------
IF :NEW.STATUS = 'CLOSE' and v1 =1 THEN  
   FOR WO_REC IN WO_CUR LOOP
   IF WO_REC.STATUS = 'CLOSE' AND WO_REC.ORIGRECORDID IS NOT NULL  THEN
      UPDATE TICKET SET STATUS = 'CLOSED', changedate= sysdate WHERE TICKETID = WO_REC.ORIGRECORDID ;
[b]       [u]INSERT INTO TKSTATUS ( TICKETID,CLASS,STATUS,CHANGEBY,CHANGEDATE,TKSTATUSID )[/b]
    [b]  VALUES( '1031', 'SR','CLOSED', 'MAXADMIN', SYSDATE, TKSTATUSSEQ.nextval );[/b]
[/u]   END IF ;
END LOOP ;  
END IF;
END SR_STATUS ;
/[/left]




علما بأني عندما اقوم بتنفيذ الادخال بشكل منفصل فانه يقبل ذلك

أرجو المساعدة وجزاكم الله خيرا

رابط هذا التعليق
شارك

IF :NEW.STATUS = 'CLOSE' and v1 =1 THEN
FOR WO_REC IN WO_CUR LOOP
IF WO_REC.STATUS = 'CLOSE' AND WO_REC.ORIGRECORDID IS NOT NULL THEN
UPDATE TICKET SET STATUS = 'CLOSED', changedate= sysdate WHERE TICKETID = WO_REC.ORIGRECORDID ;
INSERT INTO TKSTATUS ( TICKETID,CLASS,STATUS,CHANGEBY,CHANGEDATE,TKSTATUSID )
VALUES( '1031', 'SR','CLOSED', 'MAXADMIN', SYSDATE, TKSTATUSSEQ.nextval );
END IF ;
END LOOP ;
END IF;
END SR_STATUS ;


المشكله فى القطعه دى تاكد اخى الفاضل ان جمل UPDATE و انسيرت تكون مطبوطه من ناحيه الكونسترين
و عشان تاكد قبل ماتنفذ انسيرت خد قيم الى مقروض التريجر يعملها فى الجدوال دىTICKET ونفذها بعيد عن التريجر وشوف هتنفذ ولا لا اكيد انت حطط
كونسترين معين ومش واخد بالك لو موسلتش لحاجه يارت تعمل DESC لجدوال عشان نقدر نساعدك
وربنا معاك

رابط هذا التعليق
شارك

أخي المشكلة في في تعليمة Update لأنه عندما اقوم الغيها من التريجر واقوم بتنفيذه لا اواجه اي مشكلة ولكن عندما اضيفها للتريجر فانه يعطيني خطا بالتنفيذ

هل انا قادر على استخدام KSTATUSSEQ.nextval بداخل التريجر ام ان هناك طريقة اخرى لاستخدامها وتنفيذ عملية الادخال ؟؟؟

وشكراجزيلا على اهتمامكم

رابط هذا التعليق
شارك

هل انت جربت الجماه من غير ماتستخدم KSTATUSSEQ.nextval اى انك تدخل القيمه يدوى من غير سيكزنس واشتغلت
لو اشتغلت ممكن تعمل بروستدر يحمل اى فريبول بقيمه KSTATUSSEQ.nextva وتعملها كول داخال التريجر وتستخدم الفريبول بدل من KSTATUSSEQ.nextva
بس انا مفتكرش ان ده السبب لان سيكونس مكن تستخدما فى اى مكان بدل انت عملها على نفس السكيمه
على عموم ركز عاى ان جمله Update مش بتنتهك اى كونستران
وبالتوفيق

تم تعديل بواسطة mostfa_future
رابط هذا التعليق
شارك

عفوا اخي الكريم في المشاركة سبقت قصدت ان المشكلة ليست من update بل المشكلة من insert
فعندما الغي تعليمة insert و ابقي على جملة update فقط فان التريجر لا يعطيني اي رسالة خطأ عند التطبيق ولكن عند اضافة Insert فانه يعطيني الرسالة السابقة

وبنفس الوقت عندما اقوم بتنفيذ نفس تعليمة ال insert بشكل منفصل فانها تقبل ذلك ولا تعطيني اي خطأ

رابط هذا التعليق
شارك

INSERT INTO TKSTATUS ( TICKETID,CLASS,STATUS,CHANGEBY,CHANGEDATE,TKSTATUSID )
VALUES( '1031', 'SR','CLOSED', 'MAXADMIN', SYSDATE, TKSTATUSSEQ.nextval );
تاكد من كل الكونستران الى موجد على الجدول البداخل فى البيانات لان رساله الخطاء متعلقه بنتهاك كونسترين اسمه MAXIMO.TKSTATUS_NDX
ORA-00001: unique constraint (MAXIMO.TKSTATUS_NDX) violated
اكيد الكولم ده STATUS نت حطط عليه كونسترين unique
اتاكد من كل كنوسترين الى موجد على الجدوال لو موصلتش لحاجه ابعت لينا DESC لجدوال عشان نقدر نساعدك
و بالتوفيق

رابط هذا التعليق
شارك

عزيزي مصطفى
هذه الكونستراينت الموجودة على الجدول والتريجر الموجود عليه

select INDEX_OWNER,INDEX_NAME,TABLE_OWNER,TABLE_NAME,COLUMN_NAME,COLUMN_POSITION  
from all_ind_columns where index_name='TKSTATUS_NDX';

INDEX_OWNER	INDEX_NAME	TABLE_OWNER	TABLE_NAME	COLUMN_NAME	COLUMN_POSITION  
MAXIMO	    	TKSTATUS_NDX		MAXIMO		TKSTATUS		TKSTATUSID		1




select INDEX_OWNER,INDEX_NAME,TABLE_OWNER,TABLE_NAME,COLUMN_NAME,COLUMN_POSITION  
from all_ind_columns where index_name='TKSTATUS_NDX1';

INDEX_OWNER	INDEX_NAME	TABLE_OWNER	TABLE_NAME	COLUMN_NAME	COLUMN_POSITION
 
MAXIMO  	TKSTATUS_NDX1		MAXIMO		TKSTATUS	TICKETID			1	1
MAXIMO		TKSTATUS_NDX1		MAXIMO		TKSTATUS	 CLASS			2
MAXIMO		TKSTATUS_NDX1		MAXIMO		TKSTATUS	STATUS			3
MAXIMO		TKSTATUS_NDX1		MAXIMO		TKSTATUS	CHANGEDATE		4



CREATE OR REPLACE TRIGGER "MAXIMO".TKSTATUS_T BEFORE INSERT OR UPDATE ON TKSTATUS FOR EACH ROW
DECLARE NEXTVAL INTEGER; BEGIN SELECT MAXSEQ.NEXTVAL INTO NEXTVAL FROM DUAL; :NEW.ROWSTAMP := NEXTVAL; END;


ولكم جزيل الشكر

رابط هذا التعليق
شارك

استخدم الجمله دى عشان تعرض الكونسترين
SELECT constraint_name , constraint_type
FROM user_constraints
WHERE table_name = 'اسم الجدول الى بيعمل مشكاه فى الانسريت' ;
وهات الناتج بتاعه
بالتوفيق

رابط هذا التعليق
شارك

[left]SELECT constraint_name , constraint_type
FROM user_constraints WHERE table_name = 'TKSTATUS' ;
[/left]


CONSTRAINT_NAME CONSTRAINT_TYPE
SYS_C006387 C
SYS_C006388 C
SYS_C006389 C
SYS_C006390 C
SYS_C006391 C
SYS_C006392 C
SYS_C006393 C

رابط هذا التعليق
شارك

SELECT constraint_name , constraint_type
FROM user_constraints
WHERE constraint_name = 'MAXIMO.TKSTATUS_NDX ' ;
وجرب شوف هيطلع كونستران بالاسم ده مع مرعاء انك تكتب اسم الكونستران كابتل
وبعدين تاكد انك مدى قيمه لكل قبم الجدول لان عندك 7 كونستران TYPE بتاعهم c يعنى لما CHECK او NOT NULL فلو 7 كلهم NOT NULL فانت عامل فى الانسريت 6 قيم بس ممكنتكون المشكله هنا
و بالتوفيق

رابط هذا التعليق
شارك

أخي مصطفى المشكلة كانت بالكرسر وذلك لأنه يقوم بادخال نفس القيمة مرتين وهذا ما يجعله يخترق القيود الموجودة
وهذا هو الحل للمشكلة
شكرا جزيلا على تعاونكم وجهودكم


CREATE OR REPLACE TRIGGER MAXIMO.SR_STATUS
AFTER INSERT ON MAXIMO.WOSTATUS 
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
--------------------------------
DECLARE
V1 number(2) ;
O1 number(10) ;
TKTID number (10);
--------------------------------
BEGIN SELECT ORIGRECORDID INTO TKTID FROM WORKORDER WHERE WONUM = :NEW.WONUM;
SELECT COUNT(ORIGRECORDID)    INTO O1 FROM WORKORDER WHERE ORIGRECORDID =TKTID;
SELECT COUNT(DISTINCT STATUS) INTO V1 FROM WORKORDER WHERE ORIGRECORDID =TKTID;

--------------------------------
IF :NEW.STATUS='CLOSE' and O1>1 AND V1=1  THEN  
   
        UPDATE TICKET SET STATUS = 'CLOSED', changedate = sysdate WHERE TICKETID = TKTID ;
        -----------------
        INSERT INTO TKSTATUS (TICKETID,CLASS,STATUS,CHANGEBY, CHANGEDATE,MEMO,SITEID,ORGID,TKSTATUSID,ROWSTAMP)
        VALUES(TKTID, 'SR', 'CLOSED', 'MAXADMIN', SYSDATE, NULL, NULL, NULL, TKSTATUSSEQ.nextval, '1') ;
        -----------------
  END IF ;
--------------------------------
END SR_STATUS ;
/
--------------------------------


رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية