PDA

View Full Version : استفاده از SCOPE_IDENTITY در تریگر



Developer Programmer
دوشنبه 02 دی 1387, 18:51 عصر
مشکل چیه ؟




CREATE TRIGGER InsertProductTrigger
ON Products
AFTER INSERT
AS
SET NOCOUNT ON

DECLARE @NewProductID int
Declare @id1 int
Declare @id2 int

Select @NewProductID = ProductID from Inserted
Select @id1= Scope_identity()
Select @id2= @@identity

INSERT INTO ProductAudit (
Action ) VALUES (
'Product added with ProductID of ' + CONVERT(nvarchar, @NewProductID) +
' Scope_ID: ' + CONVERT(nvarchar, @ID1) +
' @@identiy: ' + CONVERT(nvarchar, @ID2))

AminSobati
دوشنبه 02 دی 1387, 22:24 عصر
مشکل شما چیه؟!

Developer Programmer
دوشنبه 02 دی 1387, 23:57 عصر
شرمنده، پست رو ادیت کردم... ظاهرا پاک شده.
میخواستم تفاوت Scope_identity و identity @@ رو ببینم. منتها هر بار که تریگر فعال میشه، مقدار Null رو Insert میکنه.

AminSobati
سه شنبه 03 دی 1387, 10:30 صبح
تست نکردم اما اگر Scope_identity مقدار NULL بده به نظر منطقی میاد چون فقط Identity تولید شده در همون Scope رو میده. Trigger شما Scope متفاوتی داره با جایی که خود دستور Insert رو فراخوانی کردین. اگر Scope_identity بلافاصله بعد از دستور Insert چک بشه باید مقدارش درست باشه. Identity@@ آخرین عدد تولید شده رو نشون میده. این عدد ممکنه از Triggerهای تو در تو تاثیر گرفته باشه پس با Scope_identity فرق داره

Developer Programmer
سه شنبه 03 دی 1387, 11:54 صبح
امین جان یه سئوال دیگه!
من همیشه مفاهیم Return, Select و Set رو قاطی می کنم.
مثلا در کد بالا اون قسمتهایی رو که Bold کردم نگاه کن. چرا می نویسیم Select اما Set نمی نویسیم؟

ar.shirazi
سه شنبه 03 دی 1387, 12:08 عصر
شرمنده، پست رو ادیت کردم... ظاهرا پاک شده.
میخواستم تفاوت Scope_identity و identity @@ رو ببینم. منتها هر بار که تریگر فعال میشه، مقدار Null رو Insert میکنه.
مشکل این جاست که شما اول مقدار identity را خوانده اید و بعد اقدام به Insert کرده اید.
کد به صورت باید باشد:

DECLARE @NewProductID int
Declare @id1 int
Declare @id2 int


INSERT INTO ProductAudit (
Action ) VALUES (
'Product added with ProductID of ' + CONVERT(nvarchar, @NewProductID) +
' Scope_ID: ' + CONVERT(nvarchar, @ID1) +
' @@identiy: ' + CONVERT(nvarchar, @ID2))

Select @NewProductID = ProductID from Inserted
Select @id1= Scope_identity()
Select @id2= @@identity

AminSobati
سه شنبه 03 دی 1387, 13:01 عصر
امین جان یه سئوال دیگه!
من همیشه مفاهیم Return, Select و Set رو قاطی می کنم.
مثلا در کد بالا اون قسمتهایی رو که Bold کردم نگاه کن. چرا می نویسیم Select اما Set نمی نویسیم؟

برای مقدار دهی به متغیر هم از Set و هم از Select میشه استفاده کرد. به کمک Select میشه چند متغیر رو یکباره مقدار داد:
select @x=1,@y=2

از طرفی، اگر Select شما چند رکورد برگردونه، آخرین رکورد مقدارش در متغیر قرار میگیره در حالی که اگر جلوی set و علامت تساوی، یک Subquery بنویسید، چنانچه چند رکورد برگردونه شما با خطا مواجه خواهید شد. گاهی وقتها این به نفع شماست و گاهی اوقات نمیخواید!
و اما Return برای مقدار دهی به متغیر نیست، کاربرد خودش رو در Moduleها داره. مثل SP یا Function یا Trigger