آموزش دستور DROP TRIGGER در SQL Server
مقدمه
DROP TRIGGER یکی از اجزای مهم مدیریت Trigger در Microsoft SQL Server است. این قابلیت زمانی ارزشمند میشود که واکنش به تغییر داده یا ساختار باید در سطح موتور پایگاه داده یکسان و قابل ممیزی باشد. با این حال هر تریگر بخشی از تراکنش فراخوان است؛ بنابراین خطا، تأخیر یا قفل اضافه آن مستقیماً روی عملیات اصلی اثر میگذارد.
در این راهنما از تعریف پایه تا سناریوهای چندردیفی، NULL، کنترل خطا، ممیزی، امنیت و بهینهسازی پیش میرویم. همه نمونهها برای محیط آموزشی نوشته شدهاند و اشیای موقت آموزشی را در پایان پاک میکنند. برای دیدن جایگاه این موضوع میان سایر انواع و دستورها، راهنمای جامع Triggerهای SQL Server را نیز مطالعه کنید.
تعریف، نحو و دامنه کاربرد
حذف کنترلشده تریگر هدف اصلی این مبحث است. تعریف دقیق باید شامل رویداد، دامنه شیء، زمان اجرا و رفتار تراکنشی باشد. در تریگرهای DML دو جدول منطقی inserted و deleted تصویر مجموعه ردیفهای جدید و قدیم را ارائه میکنند؛ در تریگرهای DDL تابع EVENTDATA جزئیات رخداد ساختاری را به XML برمیگرداند؛ و در LOGON باید مسیر بازیابی مدیریتی از قبل تضمین شود.
الگوی نحوی مرجع
-- الگوی آموزشی؛ نام، دامنه و رویداد را متناسب با موضوع انتخاب کنید
CREATE TRIGGER dbo.TriggerName ON dbo.TableName AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
-- منطق مجموعهمحور، کوتاه و قابل آزمون
END;
ورودیها و خروجی
- نام تریگر باید در دامنه مربوط یکتا، معنادار و مطابق استاندارد تیم باشد.
- رویداد یا گروه رویداد تعیین میکند تریگر در چه تغییراتی اجرا شود.
- خروجی مستقیمی مانند تابع وجود ندارد؛ اثر تریگر در تراکنش، داده ممیزی، پیام خطا یا ROLLBACK دیده میشود.
- مجوز ایجاد یا تغییر تریگر باید فقط به نقش استقرار داده شود و حساب برنامه مجوز مدیریتی نداشته باشد.
مثالهای عملی از پایه تا حرفهای
مثال 1: ساختار پایه و اجرای نخستین سناریو
این مثال از یک سناریوی کوچک و قابل مشاهده شروع میکند تا ترتیب اجرای دستور، رویداد و اثر نهایی روشن شود. تمرکز این Query روی DROP TRIGGER است و نام اشیای آزمایشی با پیشوند G17 انتخاب شده تا پاکسازی و تشخیص آنها ساده باشد.
DROP TABLE IF EXISTS dbo.G17_Drop_Base; CREATE TABLE dbo.G17_Drop_Base(ID int);
EXEC(N'CREATE TRIGGER dbo.TR_G17_Drop_Base ON dbo.G17_Drop_Base AFTER INSERT AS SELECT 1;');
DROP TRIGGER dbo.TR_G17_Drop_Base;
SELECT CASE WHEN OBJECT_ID(N'dbo.TR_G17_Drop_Base',N'TR') IS NULL THEN N'حذف شد' ELSE N'موجود است' END AS Result;
DROP TABLE dbo.G17_Drop_Base;
| خروجی مورد انتظار | تفسیر |
|---|
| نتیجه نمونه 1 | دستور مرتبط با DROP TRIGGER اجرا شده و نتیجه قابل کنترل است. |
نکته کاربردی: این الگو را پیش از انتقال به تولید با عملیات چندردیفی، مقدار NULL و خطای عمدی آزمایش کنید. در سناریوی واقعی باید دسترسیها حداقلی، نام اشیا ثابت، تراکنش کوتاه و جدول مقصد دارای ایندکس مناسب باشد؛ همچنین ثبت رخداد نباید اطلاعات حساس غیرضروری را ذخیره کند.
مثال 2: ثبت ممیزی روی جدول عملیاتی
در این سناریو تغییرات یک جدول کسبوکار در جدول ممیزی ذخیره میشود تا زمان، کاربر و نوع عملیات قابل پیگیری باشد. تمرکز این Query روی DROP TRIGGER است و نام اشیای آزمایشی با پیشوند G17 انتخاب شده تا پاکسازی و تشخیص آنها ساده باشد.
DROP TABLE IF EXISTS dbo.G17_Drop_Audit; CREATE TABLE dbo.G17_Drop_Audit(ID int);
EXEC(N'CREATE TRIGGER dbo.TR_G17_Drop_Audit ON dbo.G17_Drop_Audit AFTER UPDATE AS SELECT 1;');
IF OBJECT_ID(N'dbo.TR_G17_Drop_Audit',N'TR') IS NOT NULL DROP TRIGGER dbo.TR_G17_Drop_Audit;
SELECT N'حذف شرطی بدون خطا انجام شد' AS Result;
DROP TABLE dbo.G17_Drop_Audit;
| خروجی مورد انتظار | تفسیر |
|---|
| نتیجه نمونه 2 | دستور مرتبط با DROP TRIGGER اجرا شده و نتیجه قابل کنترل است. |
نکته کاربردی: این الگو را پیش از انتقال به تولید با عملیات چندردیفی، مقدار NULL و خطای عمدی آزمایش کنید. در سناریوی واقعی باید دسترسیها حداقلی، نام اشیا ثابت، تراکنش کوتاه و جدول مقصد دارای ایندکس مناسب باشد؛ همچنین ثبت رخداد نباید اطلاعات حساس غیرضروری را ذخیره کند.
مثال 3: پردازش چندردیفی و مجموعهمحور
هدف این مثال نشاندادن این نکته است که inserted و deleted ممکن است همزمان چند ردیف داشته باشند و منطق نباید تکردیفی نوشته شود. تمرکز این Query روی DROP TRIGGER است و نام اشیای آزمایشی با پیشوند G17 انتخاب شده تا پاکسازی و تشخیص آنها ساده باشد.
DROP TABLE IF EXISTS dbo.G17_Drop_Multi; CREATE TABLE dbo.G17_Drop_Multi(ID int);
EXEC(N'CREATE TRIGGER dbo.TR_G17_Drop_I ON dbo.G17_Drop_Multi AFTER INSERT AS SELECT 1;');
EXEC(N'CREATE TRIGGER dbo.TR_G17_Drop_U ON dbo.G17_Drop_Multi AFTER UPDATE AS SELECT 1;');
DROP TRIGGER dbo.TR_G17_Drop_I, dbo.TR_G17_Drop_U;
SELECT COUNT(*) AS RemainingTriggers FROM sys.triggers WHERE parent_id=OBJECT_ID(N'dbo.G17_Drop_Multi');
DROP TABLE dbo.G17_Drop_Multi;
| خروجی مورد انتظار | تفسیر |
|---|
| نتیجه نمونه 3 | دستور مرتبط با DROP TRIGGER اجرا شده و نتیجه قابل کنترل است. |
نکته کاربردی: این الگو را پیش از انتقال به تولید با عملیات چندردیفی، مقدار NULL و خطای عمدی آزمایش کنید. در سناریوی واقعی باید دسترسیها حداقلی، نام اشیا ثابت، تراکنش کوتاه و جدول مقصد دارای ایندکس مناسب باشد؛ همچنین ثبت رخداد نباید اطلاعات حساس غیرضروری را ذخیره کند.
مثال 4: استفاده در مسیر UPDATE
این نمونه رفتار موضوع را هنگام بهروزرسانی بررسی میکند و تفاوت مقدار قدیم و جدید را بدون اتکا به متغیر اسکالر نشان میدهد. تمرکز این Query روی DROP TRIGGER است و نام اشیای آزمایشی با پیشوند G17 انتخاب شده تا پاکسازی و تشخیص آنها ساده باشد.
DROP TABLE IF EXISTS dbo.G17_Drop_Disabled; CREATE TABLE dbo.G17_Drop_Disabled(ID int);
EXEC(N'CREATE TRIGGER dbo.TR_G17_Drop_Disabled ON dbo.G17_Drop_Disabled AFTER INSERT AS SELECT 1;');
DISABLE TRIGGER dbo.TR_G17_Drop_Disabled ON dbo.G17_Drop_Disabled;
DROP TRIGGER dbo.TR_G17_Drop_Disabled;
SELECT N'تریگر غیرفعال نیز حذف شد' AS Result;
DROP TABLE dbo.G17_Drop_Disabled;
| خروجی مورد انتظار | تفسیر |
|---|
| نتیجه نمونه 4 | دستور مرتبط با DROP TRIGGER اجرا شده و نتیجه قابل کنترل است. |
نکته کاربردی: این الگو را پیش از انتقال به تولید با عملیات چندردیفی، مقدار NULL و خطای عمدی آزمایش کنید. در سناریوی واقعی باید دسترسیها حداقلی، نام اشیا ثابت، تراکنش کوتاه و جدول مقصد دارای ایندکس مناسب باشد؛ همچنین ثبت رخداد نباید اطلاعات حساس غیرضروری را ذخیره کند.
مثال 5: اعمال شرط تجاری و کنترل تراکنش
سناریو یک قانون کسبوکار را در مرز پایگاه داده اعمال میکند و نحوه بازگردانی تغییر نامعتبر را بهشکل شفاف نمایش میدهد. تمرکز این Query روی DROP TRIGGER است و نام اشیای آزمایشی با پیشوند G17 انتخاب شده تا پاکسازی و تشخیص آنها ساده باشد.
IF EXISTS(SELECT 1 FROM sys.triggers WHERE name=N'TR_G17_Drop_DDL' AND parent_class_desc=N'DATABASE') DROP TRIGGER TR_G17_Drop_DDL ON DATABASE;
EXEC(N'CREATE TRIGGER TR_G17_Drop_DDL ON DATABASE FOR CREATE_TABLE AS BEGIN SET NOCOUNT ON; END');
DROP TRIGGER TR_G17_Drop_DDL ON DATABASE;
SELECT N'تریگر سطح دیتابیس حذف شد' AS Result;
| خروجی مورد انتظار | تفسیر |
|---|
| نتیجه نمونه 5 | دستور مرتبط با DROP TRIGGER اجرا شده و نتیجه قابل کنترل است. |
نکته کاربردی: این الگو را پیش از انتقال به تولید با عملیات چندردیفی، مقدار NULL و خطای عمدی آزمایش کنید. در سناریوی واقعی باید دسترسیها حداقلی، نام اشیا ثابت، تراکنش کوتاه و جدول مقصد دارای ایندکس مناسب باشد؛ همچنین ثبت رخداد نباید اطلاعات حساس غیرضروری را ذخیره کند.
مثال 6: رفتار مقدار NULL و داده ناقص
در این مثال حالت NULL عمداً وارد جریان میشود تا مقایسه سهارزشی SQL و استفاده درست از COALESCE یا شرط IS NULL دیده شود. تمرکز این Query روی DROP TRIGGER است و نام اشیای آزمایشی با پیشوند G17 انتخاب شده تا پاکسازی و تشخیص آنها ساده باشد.
DROP TABLE IF EXISTS dbo.G17_Drop_Null; CREATE TABLE dbo.G17_Drop_Null(ID int NULL);
IF OBJECT_ID(N'dbo.TR_G17_Drop_NotExists',N'TR') IS NOT NULL DROP TRIGGER dbo.TR_G17_Drop_NotExists;
SELECT N'نبودن شیء مدیریت شد' AS Result;
DROP TABLE dbo.G17_Drop_Null;
| خروجی مورد انتظار | تفسیر |
|---|
| نتیجه نمونه 6 | دستور مرتبط با DROP TRIGGER اجرا شده و نتیجه قابل کنترل است. |
نکته کاربردی: این الگو را پیش از انتقال به تولید با عملیات چندردیفی، مقدار NULL و خطای عمدی آزمایش کنید. در سناریوی واقعی باید دسترسیها حداقلی، نام اشیا ثابت، تراکنش کوتاه و جدول مقصد دارای ایندکس مناسب باشد؛ همچنین ثبت رخداد نباید اطلاعات حساس غیرضروری را ذخیره کند.
مثال 7: حالت مرزی و عملیات دستهای
این نمونه یک ورودی غیرمعمول و چند ردیف همزمان را آزمایش میکند تا پایداری منطق در بار واقعی ارزیابی شود. تمرکز این Query روی DROP TRIGGER است و نام اشیای آزمایشی با پیشوند G17 انتخاب شده تا پاکسازی و تشخیص آنها ساده باشد.
DROP TABLE IF EXISTS dbo.G17_Drop_Edge; CREATE TABLE dbo.G17_Drop_Edge(ID int);
EXEC(N'CREATE TRIGGER dbo.TR_G17_Drop_Edge ON dbo.G17_Drop_Edge AFTER DELETE AS SELECT 1;');
SELECT is_disabled FROM sys.triggers WHERE object_id=OBJECT_ID(N'dbo.TR_G17_Drop_Edge');
DROP TRIGGER dbo.TR_G17_Drop_Edge;
DROP TABLE dbo.G17_Drop_Edge;
| خروجی مورد انتظار | تفسیر |
|---|
| نتیجه نمونه 7 | دستور مرتبط با DROP TRIGGER اجرا شده و نتیجه قابل کنترل است. |
نکته کاربردی: این الگو را پیش از انتقال به تولید با عملیات چندردیفی، مقدار NULL و خطای عمدی آزمایش کنید. در سناریوی واقعی باید دسترسیها حداقلی، نام اشیا ثابت، تراکنش کوتاه و جدول مقصد دارای ایندکس مناسب باشد؛ همچنین ثبت رخداد نباید اطلاعات حساس غیرضروری را ذخیره کند.
مثال 8: گزارشگیری سازمانی و ردیابی رخداد
سناریو برای تیم عملیات و امنیت طراحی شده است و اطلاعاتی تولید میکند که در گزارش رخداد و تحلیل تغییرات قابل استفاده باشد. تمرکز این Query روی DROP TRIGGER است و نام اشیای آزمایشی با پیشوند G17 انتخاب شده تا پاکسازی و تشخیص آنها ساده باشد.
DROP TABLE IF EXISTS dbo.G17_Drop_Deploy; CREATE TABLE dbo.G17_Drop_Deploy(ID int);
EXEC(N'CREATE TRIGGER dbo.TR_G17_Drop_Deploy ON dbo.G17_Drop_Deploy AFTER INSERT AS SELECT 1;');
BEGIN TRANSACTION;
DROP TRIGGER dbo.TR_G17_Drop_Deploy;
ROLLBACK TRANSACTION;
SELECT CASE WHEN OBJECT_ID(N'dbo.TR_G17_Drop_Deploy',N'TR') IS NOT NULL THEN N'بازیابی شد' END AS TransactionalResult;
DROP TRIGGER dbo.TR_G17_Drop_Deploy; DROP TABLE dbo.G17_Drop_Deploy;
| خروجی مورد انتظار | تفسیر |
|---|
| نتیجه نمونه 8 | دستور مرتبط با DROP TRIGGER اجرا شده و نتیجه قابل کنترل است. |
نکته کاربردی: این الگو را پیش از انتقال به تولید با عملیات چندردیفی، مقدار NULL و خطای عمدی آزمایش کنید. در سناریوی واقعی باید دسترسیها حداقلی، نام اشیا ثابت، تراکنش کوتاه و جدول مقصد دارای ایندکس مناسب باشد؛ همچنین ثبت رخداد نباید اطلاعات حساس غیرضروری را ذخیره کند.
مثال 9: روش اشتباه و نسخه اصلاحشده
ابتدا الگوی پرخطر معرفی و سپس نسخه مجموعهمحور، قابل نگهداری و سازگار با تراکنش جایگزین میشود. تمرکز این Query روی DROP TRIGGER است و نام اشیای آزمایشی با پیشوند G17 انتخاب شده تا پاکسازی و تشخیص آنها ساده باشد.
DROP TABLE IF EXISTS dbo.G17_Drop_Dependency; CREATE TABLE dbo.G17_Drop_Dependency(ID int);
EXEC(N'CREATE TRIGGER dbo.TR_G17_Drop_Dependency ON dbo.G17_Drop_Dependency AFTER INSERT AS SELECT 1;');
SELECT OBJECT_DEFINITION(OBJECT_ID(N'dbo.TR_G17_Drop_Dependency')) AS DefinitionBeforeDrop;
DROP TRIGGER dbo.TR_G17_Drop_Dependency;
DROP TABLE dbo.G17_Drop_Dependency;
| خروجی مورد انتظار | تفسیر |
|---|
| نسخه اصلاحشده اجرا شد | دستور مرتبط با DROP TRIGGER اجرا شده و نتیجه قابل کنترل است. |
نکته کاربردی: این الگو را پیش از انتقال به تولید با عملیات چندردیفی، مقدار NULL و خطای عمدی آزمایش کنید. در سناریوی واقعی باید دسترسیها حداقلی، نام اشیا ثابت، تراکنش کوتاه و جدول مقصد دارای ایندکس مناسب باشد؛ همچنین ثبت رخداد نباید اطلاعات حساس غیرضروری را ذخیره کند.
مثال 10: کارایی، ایندکس و کاهش سربار
مثال پایانی روی کاهش خواندن منطقی، کوتاه نگهداشتن تراکنش و ایندکس مناسب ستونهای اتصال و فیلتر تمرکز دارد. تمرکز این Query روی DROP TRIGGER است و نام اشیای آزمایشی با پیشوند G17 انتخاب شده تا پاکسازی و تشخیص آنها ساده باشد.
DROP TABLE IF EXISTS dbo.G17_Drop_Perf; CREATE TABLE dbo.G17_Drop_Perf(ID int);
EXEC(N'CREATE TRIGGER dbo.TR_G17_Drop_Perf ON dbo.G17_Drop_Perf AFTER INSERT AS SELECT 1;');
SELECT name,is_disabled FROM sys.triggers WHERE parent_id=OBJECT_ID(N'dbo.G17_Drop_Perf');
IF OBJECT_ID(N'dbo.TR_G17_Drop_Perf',N'TR') IS NOT NULL DROP TRIGGER dbo.TR_G17_Drop_Perf;
SELECT N'پاکسازی استقرار کامل شد' AS Result;
DROP TABLE dbo.G17_Drop_Perf;
| خروجی مورد انتظار | تفسیر |
|---|
| سربار کنترلشده و خروجی صحیح | دستور مرتبط با DROP TRIGGER اجرا شده و نتیجه قابل کنترل است. |
نکته کاربردی: این الگو را پیش از انتقال به تولید با عملیات چندردیفی، مقدار NULL و خطای عمدی آزمایش کنید. در سناریوی واقعی باید دسترسیها حداقلی، نام اشیا ثابت، تراکنش کوتاه و جدول مقصد دارای ایندکس مناسب باشد؛ همچنین ثبت رخداد نباید اطلاعات حساس غیرضروری را ذخیره کند.
خطاهای رایج و روش عیبیابی
مهمترین خطا در DROP TRIGGER نوشتن SELECT اسکالر از inserted یا deleted و فرض وجود تنها یک ردیف است. خطای دوم انجام پردازش کند، Cursor، تماس بیرونی یا Query بدون ایندکس درون تراکنش است. خطای سوم فراموشکردن اثر بازگشتی یا زنجیرهای Triggerهاست که میتواند ترتیب رخدادها را پیچیده کند.
برای عیبیابی، ابتدا تعریف را از sys.sql_modules و وضعیت را از sys.triggers استخراج کنید. سپس با Extended Events، Query Store در بخشهای قابل ثبت، آمار IO و TIME و گزارش قفلها مشخص کنید تأخیر داخل کدام عبارت رخ میدهد. آزمون باید عملیات صفرردیفی، تکردیفی، دستهای، خطادار و همزمان را پوشش دهد و نتیجه تراکنش اصلی را نیز کنترل کند.
ملاحظات کارایی و امنیت
تریگر سریع الزاماً تریگر کوتاهمتن نیست؛ معیار واقعی تعداد خواندن منطقی، طرح اجرا، مدت نگهداری قفل و رشد Log است. اتصال inserted یا deleted به جدولهای بزرگ باید از ستون ایندکسشده انجام شود. ثبت فقط ستونهای لازم، استفاده از INSERT مجموعهمحور و حذف Queryهای تکراری معمولاً بیشترین بهبود را ایجاد میکند.
از دید امنیتی، EXECUTE AS، مالکیت زنجیرهای و دسترسی مقصد ممیزی باید بررسی شود. متن EVENTDATA یا داده برنامه ممکن است شامل اطلاعات حساس باشد؛ بنابراین حداقلگرایی، محدودیت دسترسی و سیاست نگهداری لازم است. برای LOGON هرگز بدون اتصال DAC، استثنای حساب اضطراری و آزمون جداگانه محدودیت سراسری فعال نکنید.
سؤالات متداول
پرسش 1: DROP TRIGGER دقیقاً چه مسئلهای را حل میکند؟
این موضوع اجرای خودکار یا مدیریت منطق واکنشی را نزدیک داده ممکن میکند. انتخاب آن باید پس از بررسی جایگزینهایی مانند قید، رویه ذخیرهشده، Extended Events و لایه سرویس انجام شود تا پیچیدگی پنهان ایجاد نشود.
پرسش 2: برای شروع یادگیری DROP TRIGGER چه پیشنیازهایی لازم است؟
شناخت تراکنش، سطوح دسترسی، دستورهای DML و DDL و شیوه کار جداول منطقی inserted و deleted پایه مناسبی است. تمرین روی پایگاه آزمایشی و مشاهده execution plan و آمار زمان اجرا مسیر یادگیری را بسیار کوتاهتر میکند.
پرسش 3: آیا استفاده از DROP TRIGGER برای یک پروژه تجاری مناسب است؟
بله، وقتی الزام ممیزی یا قانون یکپارچگی باید مستقل از برنامههای متعدد اجرا شود انتخاب خوبی است. در پروژه تجاری لازم است هزینه نگهداری، مانیتورینگ، آزمون بار و روش غیرفعالسازی اضطراری نیز در برآورد فنی دیده شود.
پرسش 4: هزینه طراحی و پیادهسازی حرفهای DROP TRIGGER چگونه تعیین میشود؟
حجم تراکنش، تعداد جدولها، حساسیت امنیتی، نیاز گزارشگیری و سطح آزمون عوامل اصلی هستند. پیش از برآورد، مشاوره SQL Server باید سناریوهای شکست، همزمانی و بازیابی را استخراج کند تا دامنه کار دقیق باشد.
پرسش 5: DROP TRIGGER چه تفاوتی با اجرای همان منطق در برنامه دارد؟
منطق تریگر برای همه مصرفکنندگان داده یکسان اجرا میشود، اما در برنامه مشاهدهپذیری و کنترل جریان سادهتر است. تصمیم درست معمولاً ترکیبی است: قواعد حیاتی نزدیک داده و گردشکارهای طولانی در سرویس برنامه قرار میگیرند.
پرسش 6: برای بازبینی یا اصلاح DROP TRIGGER موجود چه خدمتی لازم است؟
بازبینی شامل استخراج تعریف، تحلیل وابستگی، اندازهگیری زمان و خواندن منطقی، بررسی بنبست و ساخت آزمون چندردیفی است. سپس تغییر در محیط آزمایش اجرا و با اسکریپت بازگشت و چکلیست استقرار تحویل میشود.
پرسش 7: رایجترین خطا در DROP TRIGGER چیست؟
فرض تکردیفی بودن inserted یا deleted، حذف SET NOCOUNT ON و اجرای Query سنگین برای هر ردیف از خطاهای پرتکرار هستند. راهحل، منطق مجموعهمحور، تراکنش کوتاه، مدیریت خطا و تست INSERT یا UPDATE دستهای است.
پرسش 8: DROP TRIGGER چه اثری بر Performance دارد؟
زمان اجرای تریگر بخشی از زمان همان تراکنش است و قفلها را طولانیتر نگه میدارد. ایندکس ستونهای اتصال، محدودکردن ستونهای ثبتشده، پرهیز از فراخوانی شبکه و پایش Query Store یا Extended Events ضروری است.
پرسش 9: بهترین روش نگهداری DROP TRIGGER چیست؟
تعریف شیء باید در کنترل نسخه باشد و همراه با آزمون مثبت، منفی، NULL، چندردیفی و همزمانی منتشر شود. نامگذاری استاندارد، توضیح هدف، مالک مشخص و اسکریپت Rollback باعث میشود تغییرات بعدی قابل اعتماد بماند.
پرسش 10: DROP TRIGGER با کدام نسخههای SQL Server سازگار است؟
هسته قابلیت در نسخههای متداول SQL Server وجود دارد، ولی گزینههایی مانند CREATE OR ALTER یا برخی رویدادها به نسخه وابستهاند. پیش از استقرار باید مستندات همان نسخه، Compatibility Level و محدودیت Azure SQL بررسی شود.
سؤالات مصاحبه تخصصی
سؤال 1: چرا یک تریگر باید مجموعهمحور باشد؟
زیرا یک دستور میتواند صفر، یک یا هزاران ردیف را تغییر دهد و inserted یا deleted نماینده کل مجموعه است، نه یک ردیف تضمینشده.
سؤال 2: SET NOCOUNT ON چه فایدهای دارد؟
پیام تعداد ردیفهای میانی را حذف میکند و از ایجاد ترافیک و رفتار غیرمنتظره برخی کلاینتها جلوگیری میکند.
سؤال 3: چگونه اثر کارایی را اندازه میگیرید؟
مدت تراکنش، CPU، logical reads، waitها، قفلها و برنامه اجرای Queryهای داخل تریگر پیش و پس از تغییر مقایسه میشوند.
سؤال 4: چه زمانی تریگر انتخاب مناسبی نیست؟
وقتی پردازش طولانی، تماس شبکه، ارسال ایمیل یا گردشکار قابل تکرار لازم است، صف یا سرویس پسزمینه انتخاب امنتری است.
سؤال 5: استقرار DROP TRIGGER چگونه ایمن میشود؟
با نسخهگذاری، آزمون روی داده مشابه تولید، پنجره استقرار، اسکریپت بازگشت، حساب اضطراری و مانیتورینگ پس از انتشار.
چکلیست نهایی و جمعبندی
- هدف Trigger و دلیل انتخاب آن مستند شده است.
- عملیات چندردیفی، NULL، خطا و Rollback آزمایش شدهاند.
- زمان اجرا و logical reads پیش و پس از تغییر ثبت شدهاند.
- اسکریپت استقرار و بازگشت در کنترل نسخه قرار دارد.
- مانیتورینگ و مالک پاسخگو برای محیط تولید مشخص است.
DROP TRIGGER وقتی موفق است که قانون موردنظر را بهصورت قابل پیشبینی، سریع و قابل مشاهده اجرا کند. طراحی مجموعهمحور، تراکنش کوتاه، آزمون خودکار و مسیر بازگشت چهار ستون اصلی این موفقیت هستند. برای ادامه یادگیری و مقایسه با مباحث مرتبط، به مقاله مادر تریگرها در SQL Server بازگردید.