PDA

View Full Version : Trigger on Published table does not fire



sknsphr
چهارشنبه 13 تیر 1386, 11:03 صبح
سلام
من تو Transactional Replication تو Destination Table یه تریگر گذاشتم ولی موقعی که Snapshot اجرا می‌شه و یه کپی اولیه از داده‌ها تو جدول قرار می‌گیره انگار که تریگر اجرا نشده. Publisher و Distributor و Subscriber همه یه سرور SQL 2005 هستن. تو publication گزینه Action if name is in use برای Destination object رو روی Keep existing object unchanged تنظیم می‌کنم. یعنی تریگر دست نمی‌خوره. چرا اینجوریه؟ تو Synchronizeهای بعدی تریگر کار می‌کنه.

AminSobati
شنبه 16 تیر 1386, 00:48 صبح
دوست عزیزم مشکل رو کمی واضح تر توضیح بدین. زمانی که Snapshot اولیه انتقال پیدا میکنه منطقا Trigger نباید اجرا بشه

sknsphr
شنبه 16 تیر 1386, 09:04 صبح
زمانی که Snapshot اولیه انتقال پیدا میکنه منطقا Trigger نباید اجرا بشه
ممنون
جوابمو گرفتم. ولی چرا؟

یه سؤال دیگه.
من تو Transactional Replication فقط یه فیلد رو Replicate می‌کنم ولی تو Destination Table یه فیلد اضافی دارم یعنی 2 تا فیلد دارم. Publisher و Distributor و Subscriber همه یه سرور SQL 2005 هستن. تو publication گزینه Action if name is in use برای Destination object رو روی Keep existing object unchanged تنظیم می‌کنم. تو این حالت اصلا Snapshot منتقل نمی‌شه. با شرایط کاملا مشابه و بدون فیلد اضافی تو Destination Table، مشکلی ندارم. می‌خوام بدونم تنظیمات من مشکل داره یا چنین چیزی امکان نداره.
یعنی من باید فیلدهای اضافی رو بعد از انتقال Snapshot به Destination Table اضافه کنم؟

AminSobati
یک شنبه 17 تیر 1386, 23:25 عصر
- زمانی که Snapshot منتقل میشه، یعنی تصویر لحظه ای از جدول، همون چیزی که در لحظه ساخت Snapshot دیده شده. فرض کنین رکوردهای جدول موقع Insert اولیه توسط Trigger پردازش شدن، حالا اگر به بهانه Snapshot دوباره پردازش بشن، قطعا مشکل ایجاد میکنه.

- فیلدهای Not Null حتما باید منتقل بشن.

AminSobati
یک شنبه 17 تیر 1386, 23:32 عصر
- زمانی که Snapshot منتقل میشه، یعنی تصویر لحظه ای از جدول، همون چیزی که در لحظه ساخت Snapshot دیده شده. فرض کنین رکوردهای جدول موقع Insert اولیه توسط Trigger پردازش شدن، حالا اگر به بهانه Snapshot دوباره پردازش بشن، قطعا مشکل ایجاد میکنه.

- فیلدهای Not Null حتما باید منتقل بشن.

sknsphr
دوشنبه 18 تیر 1386, 12:46 عصر
- زمانی که Snapshot منتقل میشه، یعنی تصویر لحظه ای از جدول، همون چیزی که در لحظه ساخت Snapshot دیده شده. فرض کنین رکوردهای جدول موقع Insert اولیه توسط Trigger پردازش شدن، حالا اگر به بهانه Snapshot دوباره پردازش بشن، قطعا مشکل ایجاد میکنه.

- فیلدهای Not Null حتما باید منتقل بشن.

خیلی ببخشید. من اشتباه نوشتم. :اشتباه::اشتباه:
من تو Transactional Replication تو Destination Table یه تریگر گذاشتم ولی موقعی که Snapshot اجرا می‌شه و یه کپی اولیه از داده‌ها تو جدول قرار می‌گیره انگار که تریگر اجرا نشده. Publisher و Distributor و Subscriber همه یه سرور SQL 2005 هستن. تو publication گزینه Action if name is in use برای Destination object رو روی Keep existing object unchanged تنظیم می‌کنم. یعنی تریگر دست نمی‌خوره. چرا اینجوریه؟ تو Synchronizeهای بعدی تریگر کار می‌کنه. شاید مثل BULK INSERT باشه که تریگر Disable می‌شه؟

من تو Transactional Replication فقط یه فیلد رو Replicate می‌کنم ولی تو Destination Table یه فیلد اضافی دارم یعنی 2 تا فیلد دارم. Publisher و Distributor و Subscriber همه یه سرور SQL 2005 هستن. تو publication گزینه Action if name is in use برای Destination object رو روی Keep existing object unchanged تنظیم می‌کنم. تو این حالت اصلا Snapshot منتقل نمی‌شه. با شرایط کاملا مشابه و بدون فیلد اضافی تو Destination Table، مشکلی ندارم. می‌خوام بدونم تنظیمات من مشکل داره یا چنین چیزی امکان نداره.
یعنی من باید فیلدهای اضافی رو بعد از انتقال Snapshot به Destination Table اضافه کنم؟

AminSobati
دوشنبه 18 تیر 1386, 22:19 عصر
- Snapshot یک پروسه مثل Import/Export محسوب نمیشه، بلکه اطلاعاتی که در Publication دارین، باید عینا به Destination ارسال بشه. فرض کنین روی جدول اصلی که قرار Publish بشه، یک Trigger دارین که وقتی رکوردی Insert میشه، یکی از رکوردهای دیگه در همین جدول رو ویرایش میکنه. حالا وقتی Snapshot از این جدول رو به مقصد میبرین، چنانچه Trigger اونجا هم مجددا عمل کنه، مقادیر بدست اومده در جدول باز هم دچار تغییر میشن، و این دیگه Snapshot نیست چون با اصل جدول در Publisher الان مغایرت داره.

- چه فیلدی اضافه شده؟ GUID؟

sknsphr
سه شنبه 19 تیر 1386, 07:56 صبح
نه. مبدا اینه:

CREATE TABLE [dbo].[PRT_T](
[PRT_CODE] [numeric](10, 0) NOT NULL,
CONSTRAINT [PK_PRT_T] PRIMARY KEY CLUSTERED
(
[PRT_CODE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

مقصد این:

CREATE TABLE [dbo].[PRT_T](
[PRT_CODE] [numeric](10, 0) NOT NULL,
[Drev] [varchar](50) NOT NULL CONSTRAINT [DF_PRT_T_Drev] DEFAULT (''),
CONSTRAINT [PK_PRT_T] PRIMARY KEY CLUSTERED
(
[PRT_CODE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

AminSobati
سه شنبه 19 تیر 1386, 22:12 عصر
فیلد Drev رو کی در مقصد ساخته؟ بالاخره از یه جایی اومده!

sknsphr
سه شنبه 19 تیر 1386, 22:37 عصر
خودم ساختم. جدول PRT_T رو قبل از Replication تو مقصد می سازم.
موقع ساختن Publication گزینه Action if name is in use برای Destination object رو روی Keep existing object unchanged تنظیم می‌کنم.
می خوام بدونم باید فیلد DRev رو حتما باید بعد از انتقال Snapshot به Destination Table اضافه کنم؟

AminSobati
سه شنبه 19 تیر 1386, 23:03 عصر
حالا چیزی که شما انتظار دارید چیه؟ SQL Server باید چکار کنه که از نظر شما درسته؟

sknsphr
سه شنبه 19 تیر 1386, 23:34 عصر
تست هوشه؟:متفکر:
اگه می دونستم که نمی پرسیدم.

AminSobati
چهارشنبه 20 تیر 1386, 22:42 عصر
نه! مساله اینجاست که من نمیدونم الان سوال شما در مورد کدوم نکته است! یعنی در درک سوال مشکل وجود داره عزیزم

sknsphr
پنج شنبه 21 تیر 1386, 19:32 عصر
من یه DB دارم: DB1 که یه Table داره: PTR_T. این Table کلی فیلد داره ولی یکیش کلید اصلیه: PRT_CODE.
یه DB دیگه دارم: DB2 که یه Table براش می سازم: PRT_T. این Table دو تا فیلد داره: PRT_CODE و DRev. یکیش رو کلید اصلی می کنم: PRT_CODE.
حالا یه Transactional Replication می سازم. Publisher و Distributor و Subscriber همه یه سرور SQL 2005 هستن.
مبدا: DB1. مقصد: DB2. فقط فیلد PRT_CODE رو Replicate می کنم. تو تنظیمات Publication مربوط PRT_T Article:

Action if name is in use:Keep existing object unchanged

تو این حالت اصلا Snapshot منتقل نمی شه. ولی وقتی فیلد DRev رو از جدول PRT_T از DB2 حذف می کنم، و Subscription رو دوباره می سازم، Snapshot درست می شه و مشکلی ندارم. سوالم اینه که:
آیا من مجبورم بعد از ساختن Subscription و انتقال Snapshot، فیلد DRev رو به جدول PRT_T تو DB2 اضافه کنم؟ راه دیگه ای نداره؟
دیگه نمی دونم چطور توضیح بدم.:عصبانی++: