PDA

View Full Version : نحوه نوشتن Trigger برای رویداد Update



hdv212
شنبه 26 اسفند 1385, 23:01 عصر
سلام ..
من این Trigger رو برای رویداد Insert نوشتم و درست عمل میکنه :
create trigger tr_InsertToInserted on Cala
for insert as
declare @id int
declare @name nvarchar(10)
select @id = id from inserted
select @name = name from inserted
insert into CalaInserted(id,name) values(@id,@name)

من همین Trigger رو به صورت زیر برای رویداد Update نوشتم ولی از من Error میگیره :
create trigger tr_UpdateCalaInserted on Cala
for update as
declare @name nvarchar(10)
select @name = name from updated
update CalaInserted set name = @name

خطایی که میگیره اینه :
Invalid object Name Updated
میشه کمکم کنید ..ممنون

AminSobati
یک شنبه 27 اسفند 1385, 09:11 صبح
عمل Update مثل حذف رکوردهای تحت Update با مقدار قدیمی و Insert کردنشون با مقدار جدید هستش. لذا در Trigger برای Update شما جدول Updated ندارین، به جاش Deleted و Inserted دارید. این دو جدول به هنگام Update همیشه دارای تعداد رکوردهای برابر هستند. برای دریافت مقدار جدید رکوردهای تحت Update، از جدول Inserted استفاده کنین

hdv212
یک شنبه 27 اسفند 1385, 11:27 صبح
مرسی آقای ثباتی مشکلم حل شد ولی چرا Trigger در حالت Insert و Trigger در حالت Update هر دو از کلمه ی Inserted استفاده میکنن ؟؟

hdv212
یک شنبه 27 اسفند 1385, 11:45 صبح
دوباره مشکل :
من این trigger رو برای رویداد Update نوشتم :
create trigger tr_UpdateCalaInserted on Cala
for update as
declare @name nvarchar(10)
select @name = name from inserted
update CalaInserted set name = @name

ولی مشکل اینجاس که وقتی تو جدول اصلی یه فیلدی رو Update میکنم توی جدول دومی همه ی فیلدها آپدیت میشن و مقدار مشابه میگیرن(یعنی همون مقداری که من تو جدول اصلی وارد کردم)
میشه کد درستشو برای من بنویسید،ممنون

hdv212
یک شنبه 27 اسفند 1385, 11:52 صبح
ببخشید مشکلم حل شد .... در بخش update، دستور Where رو وارد نکرده بودم، فکر کنم به خاطر همین همه ی جدول رو با یه فیلد Update میکرد.

AminSobati
یک شنبه 27 اسفند 1385, 15:42 عصر
ضمنا به کمک تابع ()UPDATE میتونین متوجه بشین که کدوم فیلد Update شده

hdv212
یک شنبه 27 اسفند 1385, 17:56 عصر
دوباره مشکل ..
فرض کنید من تو جدول اول یه فیلد Int دارم که PK هم هست، حالا در جدول دوم هم از این فیلد استفاده میکنم منتها بهش رفرنس نمیزنم(چون دو تا فیلد از جدول دوم به یه فیلد از جدول اول رفرنس میزنه به خاطر همین باعث اشکال میشه و من به جای رفرنس میخوام از trigger استفاده کنم) حالا میخوام هر وقت کاربر، اون فیلد Primary رو Update کرد، توسط Trigger توی جدول دوم هم مقدارش Update بشه، اینم Trigger مورد نظر :
create trigger tr_Update_t_Archive_From_t_SenderRecievers on t_SenderRecievers
for update as
declare @ID int
select @ID = SenderRecieverID from Inserted
Update t_Archive set SenderID = @ID

منتها در خط آخر در قسمت where نمیدونم چی بنویسم،اینو میدونم که باید مقدار قدیمی فیلد رو بنویسم ولی چطوری اون مقدار قدیمی رو به دست بیارم ؟؟
مرسی

AminSobati
یک شنبه 27 اسفند 1385, 22:55 عصر
http://www.barnamenevis.org/forum/showthread.php?t=61192

hdv212
دوشنبه 28 اسفند 1385, 01:19 صبح
ممنون آقای ثباتی عزیز ولی من در Trigger بخش update چیزی سر در نیاوردم :
/* Update trigger "Trigger_2" for table "Parent" */
create trigger Trigger_2 on Parent for update as
begin
declare
@maxcard int,
@numrows int,
@numnull int,
@errno int,
@errmsg varchar(255)

select @numrows = @@rowcount
if @numrows = 0
return

/* Modify parent code of "Parent" for all children in "Child" */
if update(ParentID)
begin
update Child
set ParentID = i1.ParentID
from Child t2, inserted i1, deleted d1
where t2.ParentID = d1.ParentID
and (i1.ParentID != d1.ParentID)
end
return
این دستور Update ای رو که نوشته شده میشه توضیح بدین چکار کرده ؟؟
مرسی ..

hdv212
دوشنبه 28 اسفند 1385, 12:18 عصر
آقای ثباتی عزیز سلام . این کد هست که من نوشتم :
this trigger update the child table when all or any filed of Parent table has changed--
create trigger tr_UpdateCalaInserted on Cala
for update as
declare @id int
declare @oldID int
declare @name nvarchar(10)
select @oldID = id from deleted
select @id = id from inserted
select @name = name from inserted
update CalaInserted set id = @id,name = @name where id = @oldID

AminSobati
دوشنبه 28 اسفند 1385, 19:23 عصر
من این تست رو با Trigger شما انجام دادم و مشکلی وجود نداشت:


create table Cala (id int primary key, name varchar(100))

create table CalaInserted (id int, name varchar(100))

insert Cala select 1,'c 1'
insert Cala select 2,'c 2'

insert CalaInserted select 1,'c 1'
insert CalaInserted select 2,'c 2'
insert CalaInserted select 1,'c 1'
insert CalaInserted select 2,'c 2'

create trigger tr_UpdateCalaInserted on Cala
for update as
declare @id int
declare @oldID int
declare @name nvarchar(10)
select @oldID = id from deleted
select @id = id from inserted
select @name = name from inserted
update CalaInserted set id = @id,name = @name where id = @oldID
go

update Cala set id=20 where id=2

hdv212
دوشنبه 28 اسفند 1385, 20:31 عصر
سلام آقای ثباتی عزیز .. الحق و الانصاف خسته نباشید ...
من مشکلم حل شد .. اون کدی رو هم که به شما دادم مشکل نداشت،فقط وقتی که من فیلد Primary key رو در جدول اول Update میکردم، در جدول دوم هم Update میشد ولی چون مقدار جدید اون فیلد از تمام مقادیر جدول بزرگتر بود، میرفت ته جدول قرار میگرفت،چون روش Sort انجام میداد و من فکر میکردم که رکورد رو اشتباهی داره update میکنه ... به هر حال خیلی ممنون .. خسته نباشید ..مرسی