PDA

View Full Version : سوال: نیاز به کمک برای استفاده از trigger



ali9698
چهارشنبه 17 آبان 1391, 23:28 عصر
سلام بچه ها
من یه جدول دارم. میخوام وقتی که یه رکورد بهش اضافه میشه اتوماتیک 10 تا رکورد به یه جدول دیگه اضافه بشه.
من تازه کارم. اگه ممکنه یه نفر trigger رو واسم بنویسه و البته توضیح بده

zarifcomputer
پنج شنبه 18 آبان 1391, 05:26 صبح
سلام
اول باید بدونید هدفتون از تریگر نویسی چیست. گاهی اوقات کاربران اس کیو ال کاربرد تریگر را درست متوجه نمیشوند . من خودم بار ها دچار این اشتباه شدم. واسه همین هم تجربه خودمو عرض میکنم.
اگه می خواهید قبل یا بعد از عمل Insert یا Update یا Delete رکورد یا رکورد هایی در جدولی دیگر درج شوند که با کلید جدول فعلی در ارتباط هستند ، استفاده از تریگر روش مناسبی نیست .
چون شما به رکورد جدول جاری دسترسی ندارید . مگر اینکه یک پروسه ایجاد کنید .
ولی چنانچه ارتباطی بین رکورد های درج شونده در جدول دیگر و رکورد جدول جاری وجود ندارد استفاده از تریگر میتواند مفید باشد.

به عنوان مثال میتوان تاریخ و زمان درج یا حذف یا بروز رسانی رکورد ها در یک جدول را در جدولی دیگر به عنوان Log با روش تریگر تهیه کرد
این هم یک نمونه:


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER dbo.Trigger_Name
ON Table_Name
AFTER INSERT,DELETE,UPDATE
AS
BEGIN
SET NOCOUNT ON;

Insert Into TableLog (EventDate, EventID) values(GetDate(), @EventID);
END
GO

ali9698
جمعه 19 آبان 1391, 11:15 صبح
ممنون که جواب دادین
خوب راه حل چیه؟ توی جدول اول یک کلید اصلی دارم که توی جدول دوم باید به شکل کلید خارجی وجود داشته باشه.
اگه میشه کمک کنید

zarifcomputer
جمعه 19 آبان 1391, 17:33 عصر
سلام
بهتره که عمل Insert یا Delete یا Update را از طریق یک Stored Procedure انجام بدید تا بتونید رویداد مورد نظر خودتونو مدیریت کنید
به مثال زیر توجه کنید:


USE [MyDatabase]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[InsertCommand]
@Field1 int,
@Field2 int,
@Field3 int
AS
BEGIN
SET NOCOUNT ON;
declare @InsertedID int;

INSERT INTO Table1
(Field1,Field2,Field3)
VALUES
(@Field1,@Field2,@Field3)
set @InsertedID = (select SCOPE_IDENTITY());

INSERT INTO Table2 (Fld1,Fld2,Fld3,Fld4)

Values
(@InsertedID , 1,1,1),
(@InsertedID , 1,1,2),
(@InsertedID , 1,1,3),
(@InsertedID , 1,1,4),
(@InsertedID , 1,1,5),
(@InsertedID , 1,1,6),
(@InsertedID , 1,1,7),
(@InsertedID , 1,1,8),
(@InsertedID , 1,1,9),
(@InsertedID , 1,1,10)


END




@InsertedID
همون فیلد مورد نظر شماست که اتفاقا از نوع Identity هست یعنی خودش مقدار تولید میکنه و در این مثال پس از تولید مقدارش در متغیر InsertedID قرار میگیره و در دستور Insert بعدی مورد استفاده قرار گرفته میشه

امید وارم توضیحات کافی باشه