PDA

View Full Version : تریگرها



Mohammadi_F
پنج شنبه 05 بهمن 1385, 09:15 صبح
سلام
یه سوال در مورد تریگرها داشتم البته نمی دونم ، شاید روش دیگه ای وجود داشته باشه ولی این حدس خودمه که احتمالا بایستی از تریگر استفاده کرد.
اما سوال:
آیا میشه تریگری نوشت که قبل از اعمال تغییرات بر روی رکوردهای یک جدول به ازاء هر رکورد اجرا بشه و با چک کردن یک سری شرایط مقادیری رو از جدول دیگه تغییر بده.
مثلا فرض کنیم که رکوردهای یک فاکتور رو می خواهیم تغییر بدیم ولی قبل از اعمال تغییرات می خواهیم چک کنیم که نوع تغییر چیه (Update,Insert,Delete) و با توجه به اون مقادیر جدول انبار رو تغییر بدیم.
امیدوارم که مطلب رو رسونده باشم.
از همکاریتون ممنونم.

SabaSabouhi
جمعه 06 بهمن 1385, 13:22 عصر
با سلام
هنگام ایجاد Trigger شما باید اعلام کنید که Trigger چه زمانى فعال مى‌شود.
اگر بگویید For Insert هنگام افزودن سطر به جدول Trigger فعال مى‌شود.
و اگر بگویید Instead of Insert پیش از اضافه شدن ( و بجاى آن) این اتفاق مى‌افتد. و شما مى‌توانید تصمیم بگیرید که مثلاً بجاى افزودن یک رکورد یک رکورد دیگر تغییر کند.

صبا صبوحى

Mohammadi_F
شنبه 07 بهمن 1385, 02:32 صبح
من این موضوع رو به اشتباه در بخش بانکهای اطلاعاتی دلفی مطرح کرده بودم که به این بخش منتقل شده ولی مثل اینکه بخشهایی از اون حذف شده، اما متن کامل سوالم:
من یک تریگر نوشتم و می خوام وقتی کاربر فرمان (insert,update,delete) رو به جدولم می فرسته بجای اجرای فرمان مقادیر فرستاده شده به یک پروسیجر منتقل بشه و پروسیجر علاوه بر اعمال تغییرات ،با توجه به دستور کاربر ، بر روی جدول اصلی ، یک سری تغییرات رو نیز بر روی جدول دیگه ای انجام بده. پروسیجری که نوشتم اینه:

CREATE PROCEDURE [Update_Available_CSale]
(@DocNo [int],
@IDGoods [int],
@GoodsCount [int],
@Price [money],
@CountForSale [int],
@SalePrice [money],
@State [int])

AS
BEGIN

IF ((SELECT S.GoodsCount FROM dbo.Sale S WHERE (S.DocNo = @DocNo AND S.IDGoods = @IDGoods)) <> @GoodsCount) --if Count of Goods Changed
BEGIN

UPDATE dbo.Available
SET CountForSale =
CASE @State
WHEN 0 THEN CountForSale - @GoodsCount --Inserted
WHEN 1 THEN CountForSale+(Sale.GoodsCount - @GoodsCount ) --Modified
WHEN 2 THEN CountForSale + @GoodsCount --Deleted

END

WHERE
(IDGoods = @IDGoods)

END
---------------------------------------------------------------------------------
IF @State = 0 -- insert record to sale table
BEGIN
INSERT INTO Sale (DocNo,IDGoods,GoodsCount,Price)
VALUES (@DocNo,@IDGoods,@GoodsCount,@Price)
END
ELSE IF @State = 1 -- update record from sale table
BEGIN
UPDATE Sale
SET DocNo = @DocNo,
IDGoods = @IDGoods,
GoodsCount = @GoodsCount,
Price = @SalePrice
WHERE
(DocNo = @DocNo)
END
ELSE IF @State = 2 -- delete record from sale table
BEGIN
DELETE FROM Sale
WHERE (DocNo = @DocNo)
END

END
ولی این پروسیجر پیام خطایی با این عنوان می ده.
The column prefix 'Sale' does not match with a table name or alias name used in the query
واقعا ممنون می شم اگه کمکم کنین چون سه روزه دارم باهاش کلنجار می رم ولی نتونستم درستش کنم.
توی پروسیجر بالا Sale جدولیه که تریگر رو تولید کرده و Available جدولیه که به ازاء هر تغییری روی جدول Sale بایستی رکوردهایی از اون تغییر کنه.
باز هم متشکرم.

SabaSabouhi
شنبه 07 بهمن 1385, 15:46 عصر
با سلام
شما نوشته‌اید:



UPDATE dbo.Available
SET CountForSale =
CASE @State
WHEN 0 THEN CountForSale - @GoodsCount --Inserted
WHEN 1 THEN CountForSale+(Sale.GoodsCount - @GoodsCount ) --Modified
WHEN 2 THEN CountForSale + @GoodsCount --Deleted


خوب این SQL از کجا بفهمد که Sale.GoodsCount از کجا آمده؟
باید به این شکل عمل کنید:



UPDATE dbo.Available
Set <ColName> = NewValue
From dbo.Available A
JOIN dbo.Sales S ON S.<ColName> = A.<ColumnName>



صبا صبوحى

Mohammadi_F
شنبه 07 بهمن 1385, 18:29 عصر
از راهنماییتون ممنونم .
امتحان می کنم و نتیجه رو بهتون خبر میدم.
البته بازهم مزاحمتون می شم.
باز هم ممنون.

sheida
چهارشنبه 30 خرداد 1386, 12:54 عصر
سلام
من تازه شروع به یادگیری sql server کردم،و با مفهوم تریگر تازه آشنا شدم ،میشه یک سری مثال در این زمینه برای من ارسال کنید.تا من با نحوه استفاده از تریگر بهتر آشنا شوم.
با تشکر از همه دوستان

AminSobati
چهارشنبه 30 خرداد 1386, 22:26 عصر
دوست عزیزم در Books Online در قسمت CREATE TRIGGER مثال وجود داره