الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

مساعدة في عمل Database Trigger

Featured Replies

بتاريخ:

السلام عليكم ورحمة الله وبركاته
اولا احب اشكر اعضاء ومشرفين وكل من له صلة بامنتدي لما يقدمه للعرب من عظيم الفوائد + ربنا يبارك فيكم +
يا شباب عندي جدول forms_name حاطي فيه كل اسماء الفورم العندي
وجدول username فيه كل المستخدمين
وجددول user_grant فيه اسم المستخدم واسم الفورم والصلاحيات الممنوحة لهذا المستخدم علي الفورم
الفكرة:-
محتاج اعمل Database Trigger علي جدول username . اول ما يتم اضافة مستخدم جديد يقوم التريجر باضافة هذا المستخدم واسماء الفورم والصلاحيات. مبدئيا لا يملك صلاحيات.
المشكلة:-
عند ادخال بيانات في جدول المستخدمين username يديني رسالة خطاء
ERROR at line 1:
ORA-04091: table Q.USERNAME is mutating, trigger/function may not see it
ORA-06512: at "Q.USERNAME_T_INS", line 6
ORA-04088: error during execution of trigger 'Q.USERNAME_T_INS'

وانا ارفقت الجداول والتريجر
ارجو المساعدة

بتاريخ:

مفيش اى جدوال فى المرقثات ولكن

DECLARE
CURSOR users IS select DISTINCT forms_name from user_grant ;
n number(10);
P NUMBER(10); 
XX number(10);
z number (20);
BEGIN
open users ;
select fro_id_seq.NEXTVAL into Xx from dual;
انت هنا خطط رقم الموظف او اسمه الجديدو بيانتها 	INSERT INTO username VALUES(XX);
loop
FETCH users INTO n;
	EXIT WHEN z =n ;
INSERT INTO user_grant VALUES (XX,n,);--هنا بتحط فى جدوال الصلاحيات اسمه او رقمه المظزف زاسم الفورمه ودخل الصلاحيه زاى مانت عايز
z:=n;
	EXIT WHEN USERS%NOTFOUND;
		END LOOP ;
COMMIT ;
end 
'


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

بتاريخ:
  • كاتب الموضوع

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

بتاريخ:

اخي لم ترفع الجداول على المرفقات
راجع المزضوع التالي
شرح كيفيه تسجيل التغييرات التي يجريها المستخدمين على الجداول في حالة الاضافه و الحذف و التعديل

تم تعديل بواسطة ammarcontrol

بتاريخ:
  • كاتب الموضوع

طيب كيف يتم رفع المرفقات اخي؟؟؟؟؟؟

بتاريخ:
  • كاتب الموضوع

-- drop table forms_name
هذا الجدول راح اخت فيه ارقام و اسماء الفورمات بالعربي والانجليزي
create table forms_name(
formid 		number(4) primary key,
form_name	varchar2(30),
form_Ename	varchar2(30)
);
****************************************************
--drop table username; 
هنا جدول المستخدمين الاسم والرقم والباسورد
create table username(
a number(4) primary key,
username varchar2(50),
passwd varchar2(30), 
USERCode varchar2(2) 
);
****************************************************
-- drop table user_grant;
هنا جدول صلاحيات المستخدمين عل كل فورم
وهذا الجدول سيتم تعبئته اتوماتيكي من خلال التريجر وهو بيعطي المستخدم الجديد صلاحية ادخال فقط
create table user_grant(
userid 		number(4) references username( a ),
formid 		number(4) references forms_name(formid ),
add_data		number(1) default 1,
delete_data	number(1) default 0,
print_data		number(1) default 0,
preview_data	number(1) default 0,
update_data	number(1) default 0,
primary key ( userid ,formid )
);

****************************************************

--drop trigger username_t_ins;

Create or replace trigger username_t_ins
After insert on username 
REFERENCING NEW AS nRow
for each row 
declare
formid_v forms_name.formid%type;
id number;
CURSOR users_cur IS select DISTINCT formid from forms_name;
Begin
if inserting then
open users_cur;
loop
FETCH users_cur INTO formid_v;
exit when users_cur%NOTFOUND;
insert into user_grant (userid ,formid ) 
values(:nRow.a, formid_v);
END LOOP;
Commit;
end if;
end;
/
الان نحاول ادخال بيانات الفورمات
insert into forms_name values(1,'username','username');
insert into forms_name values(2,'main','main');
insert into forms_name values(3,'report','report');
insert into forms_name values(4,'student','student');
commit;

كمان نحاول اضافة مستخدم
insert into username values(3,'admin',0,0);
وهذه رسالة الخطاء البتطلع.
SQL> insert into username values(3,'admin',0,0);
insert into username values(3,'admin',0,0)
*
ERROR at line 1:
ORA-04091: table Q.USERNAME is mutating, trigger/function may not see it
ORA-06512: at "Q.USERNAME_T_INS", line 11
ORA-04088: error during execution of trigger 'Q.USERNAME_T_INS' 

بتاريخ:

الحل
احذف العبارة commit من التريكر لانه سوف يخزن تلقائيا و لا يحتاج commit هذا هو السبب

بتاريخ:

استعمل هذا الكود

grant dba to test identified by test;
connect test/test@db1;

rem *********************************

create table forms_name(
formid number(4) primary key,
form_name varchar2(30),
form_Ename varchar2(30)
);

rem *********************************

create table username(
a number(4) primary key,
username varchar2(50),
passwd varchar2(30),
USERCode varchar2(2)
);

rem *********************************

create table user_grant(
userid number(4) references username( a ),
formid number(4) references forms_name(formid ),
add_data number(1) default 1,
delete_data number(1) default 0,
print_data number(1) default 0,
preview_data number(1) default 0,
update_data number(1) default 0,
primary key ( userid ,formid )
);

rem *********************************

Create or replace trigger username_t_ins
After insert on username
REFERENCING NEW AS nRow
for each row
declare
formid_v forms_name.formid%type;
id number;
CURSOR users_cur IS select DISTINCT formid from forms_name;
Begin
if inserting then
open users_cur;
loop
FETCH users_cur INTO formid_v;
exit when users_cur%NOTFOUND;
insert into user_grant (userid ,formid )
values(:nRow.a, formid_v);
END LOOP;
end if;
end;
/

rem *********************************

insert into forms_name values(1,'username','username');
insert into forms_name values(2,'main','main');
insert into forms_name values(3,'report','report');
insert into forms_name values(4,'student','student');
commit;

rem *********************************

insert into username values(3,'admin','0','0');
commit;

rem *********************************

select * from  username;
select * from user_grant;


iqpic5cb30ed698.jpg

بتاريخ:
  • كاتب الموضوع

السلام عليكم
اخ عمار
جربت الاسكربت الحاطيه انت ونفس المشكلة

رسالة الخطاء البتطلع هي

SQL> insert into username values(3,'admin','0','0');
insert into username values(3,'admin','0','0')
*
ERROR at line 1:
ORA-04091: table QQ.USERNAME is mutating, trigger/function may not see it
ORA-06512: at "QQ.USERNAME_T_INS", line 11
ORA-04088: error during execution of trigger 'QQ.USERNAME_T_INS'


علي فكرة انا شغال علي اوراكل oracle 8i
في رايك ممكن دا يكون سبب؟؟؟

بتاريخ:

احتمال لاني شغلته على 10 جي و ماكو مشكله

بتاريخ:

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

بتاريخ:
  • كاتب الموضوع

احتمال لاني شغلته على 10 جي و ماكو مشكله


شكرا اخي عمار علي مجهوداتك المقدرة
لكن الحال في حالو
بتاريخ:

السلام عليكم
جرب تعديل الترجر كالتالي:

Create Or Replace Trigger Username_T_Ins
After Insert On Username
For Each Row
Declare
Pragma  Autonomous_Transaction;
Appo_Pr Varchar2(64):= Null;
Begin
Select Distinct Formid
  Into Appo_Pr
  From Forms_Name;
Insert Into User_Grant (Userid ,Formid ) Values (:Nrow.A, Appo_Pr);
End Username_T_Ins;
/



وبامكانك مراجعة هذا الرابط:

http://www.araboug.org/ib/index.php?showtopic=17267&hl=

بالتوفيق.

بتاريخ:

السلام عليكم ,

Create Or Replace Trigger Username_T_Ins 
After Insert On Username
Referencing New As Nrow Old As Old
For Each Row
Declare
Formid_V Forms_Name.Formid%Type;Id Number;
Cursor C Is 
      Select Formid  
        From Forms_Name;
Begin
Open C;
Loop
Fetch C Into Formid_V;
Insert Into User_Grant   (Userid ,Formid ) 
                                          Values(:Nrow.A, Formid_V);
Commit;
Exit When C%Not Found;
End Loop;
Close C;
  Exception When Others Then
      Raise;
End ;

تم تعديل بواسطة malik alwadi

  • بعد 2 سنة...
بتاريخ:

السلام عليكم ,

Create Or Replace Trigger Username_T_Ins
After Insert On Username
Referencing New As Nrow Old As Old
For Each Row
Declare
Formid_V Forms_Name.Formid%Type;Id Number;
Cursor C Is
   Select Formid  
	 From Forms_Name;
Begin
Open C;
Loop
Fetch C Into Formid_V;
Insert Into User_Grant   (Userid ,Formid )
									   Values(:Nrow.A, Formid_V);
Commit;
Exit When C%Not Found;
End Loop;
Close C;
  Exception When Others Then
   Raise;
End ;





بجد مجهود اكثر من رائع ياشباب

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

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

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

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

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

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.