Trigger در SQL – از کاربرد تا نحوه استفاده به زبان ساده
Trigger-های SQL، ابزارهای بسیار قدرتمند و کاربردی هستند. بنابراین هر توسعهدهندهای که با پایگاههای داده کار میکند، باید روش استفاده از آنها را هم بلد باشد. Trigger در SQL نوع خاصی از «رویههای ذخیره شده» (Stored Procedure) هستند که در زمان وقوع رویدادهای مشخصی به صورت خودکار فراخوانی و اجرا میشوند. برای مثال در زمان وارد شدن رکوردی به جدول مشخص میتوانیم از Trigger-ها برای بهروزرسانی رکورد دیگری در جدولی دیگر به صورت خودکار استفاده کنیم. همچنین میتوان اضافه کرد که Trigger-ها مجموعهای از عبارتهای SQL هستند که با نامهای یکتا در حافظه سیستم ذخیره میشوند. در این مطلب از مجله فرادرس، درباره Trigger در SQL بحث و روش کار این ابزار حرفهای را بررسی کردهایم.
در ادامه این مطلب، ابتدای کار به شناخت Trigger میپردازیم و بعد از آن با سینتکس این ابزار SQL آشنا میشویم. روش کار با آن را با کمک نمایش مثالهای ساده و کاربردی میبینیم و میآموزیم و کدهای خود را بر روی پایگاه داده SQL Server اجرا میکنیم. همچنین بهترین زمان برای استفاده از Trigger-ها در پایگاه داده را هم میشناسیم. سپس باید با انوع Trigger-ها آشنا شده و روش نمایش، حذف و بهروزرسانی آنها را هم تمرین کنیم. در نهایت هم درباره مزایا و معایب Trigger-ها صحبت خواهیم کرد.
Trigger در SQL چیست؟
Trigger، شیئی مرتبط با پایگاه داده و شامل کدهای مخصوصی از SQL است. این کد مخصوص به صورت خودکار در زمان رویداد اتفاقهای مشخص شده در پایگاه داده اجرا میشود. به عبارت دیگر، روی دادن رخدادهای خاص در پایگاه داده محرکی برای اجرای Trigger-ها در SQL هستند.
Trigger-ها جزوی از مهمترین ابزاری هستند که برای کوئرینویسی پیشرفته لازماند. به همین دلیل، باید در کار با آنها توانا باشیم. اما کوئرینویسی حرفهای دارای اصول و قواعد و ابزارهای دیگری هم میشود. برای آشنایی با این تکنیکها و نوشتن هرچه بهتر و موثرتر کوئریها پیشنهاد میکنیم که فیلم آموزش کوئری نویسی پیشرفته در SQL Server از فرادرس را مشاهده کنید. در ادامه لینک فیلم مورد اشاره را قرار دادهایم.
به طور کلی، Trigger-های SQL، باید با جدولهای مشخص شدهای مرتبط باشند. یعنی اینکه اگر جدول مورد نظر حذف شود، متعاقبا همه Trigger-های مرتبط با آن جدول نیز حذف خواهند شد. با توجه به جدول داده شده، Trigger-ها در SQL میتوانند قبل یا بعد از رویدادهای زیر فعال شوند.
- INSERT: وقتی که ردیف جدیدی به جدول وارد شده باشد.
- UPDATE: دادههای یکی از ردیفهای موجود در جدول، بهروزرسانی شده باشند.
- DELETE: یکی از ردیفهای موجود در جدول حذف شده باشند.
در نتیجه وقتی که یکی از کوئریها به نامهای INSERT یا UPDATE یا DELETE در SQL بر روی جدول اتفاق بیفتد، RDBMS به ماجرا نظارت کرده و به صورت خودکار یکی از Trigger-ها را اجرا میکند.
هر Trigger همیشه با جدول معینی در ارتباط است. از این رو به Trigger-ها «رویه خاص» (Special Procedure) میگویند که امکان فراخوانی آنها به صورت مستقیم مانند رویههای ذخیره شده وجود ندارد. در واقع، تمایز کلیدی بین Trigger و رویه ذخیره شده این است که Trigger به صورت خودکار هنگام روی دادن تغییرات مشخص شده در جدول مرتبط با آن فراخوانی میشود. اما در آن طرف، رویه ذخیره شده را باید به صورت مستقیم برای اجرا فراخوانی کرد.
در فهرست زیر، ویژگیهای اصلی را بیان کردهایم که باعث متمایز شدن Trigger-ها از رویههای ذخیره شده میشوند.
- امکان اجرا و فراخوانی Trigger-ها به صورت دستی وجود ندارد.
- Trigger-ها شانسی برای دریافت کردن پارامتر ندارند.
- امکان اجرای دستورات COMMIT یا ROLLBACK برای مدیریت تراکنشها در Trigger وجود ندارد.
سینتکس نوشتن Trigger
برای ساخت Trigger در نرمافزار پایگاه داده SQL Server میتوانیم از عبارت کلیدی CREATE TRIGGER استفاده کنیم.
در کادر پایین سینتکس ابتدایی و خام مربوط به نوشتن Trigger را نمایش دادهایم.
1CREATE TRIGGER schema.trigger_name
2ON table_name
3AFTER {INSERT, UPDATE, DELETE}
4[NOT FOR REPLICATION]
5AS
6{SQL_Statements}
در فهرست زیر، پارامترهای بهکار برده شده در سینتکس بالا را تعریف کردهایم.
- schema : این پارامتر اختیاری است. پارامتر schemaمشخص میکند که Trigger تعریف شده به چه طرح و شکلی تعلق دارد.
- trigger_name : این پارامتر الزامی است. پارامتر trigger_name نام مربوط به Trigger جدید تعریف شده را تعیین میکند.
- table_name : این پارامتر الزامی است. پارامتر table_nameنام جدولی را مشخص میکند که Trigger تعریف شده باید بر روی آن اعمال شود. بعد از نام جدول باید از بند AFTER استفاده کنیم. در بند AFTER هر رویدادی مانند INSERT و DELETE و UPDATE در SQL را میتوان فهرست کرد.
- NOT FOR REPLICATION : این گزینه مشخص میکند که پایگاه داده SQL Server در زمان تغییر دادههای جدول به عنوان بخشی از فرایند تکرار شونده، Trigger مورد نظر را اجرا نکند.
- SQL_Statements : این پارامتر، شامل تعداد یک یا بیشتری از عبارتهای SQL میشود. عبارتهایی که برای اجرای عملیات در پاسخ به رویداد اتفاق افتاده به کار میروند.
چه زمانی از Trigger استفاده می کنیم؟
در بعضی از سناریوهای خاص، وقتی نیاز داشته باشیم، دستوراتی به صورت خودکار اجرا شوند استفاده از Trigger-ها بسیار مفید خواهد بود. برای مثال، جدول داعما در حال تغییری در پایگاه داده وجود دارد. با توجه به شرایط شرکت خود، لازم است که تغیرات اتفاق افتاده و زمان روی دادن این تغییرات را بدانیم. در چنین سناریوهایی میتوانیم Trigger مخصوصی را برای خود ایجاد کنیم. Trigger طراحی شده برای وارد کردن دادههای مطلوب در جدول جداگانهای بهکار برده میشود. این عملیات به صورت همزمان با اعمال هر تغییر کوچکی در جدول اصلی انجام خواهد شد.
آموزش SQL Server از مبتدی تا پیشرفته با فرادرس
SQL Server یکی از نرم افزارهای پایگاه داده قدیمی و در عین حال با تجربه، بهروز و قدرتمند دنیای امروز است. این پایگاه داده کاربرد بسیار گستردهای در بخشهای آموزشی، صنعتی و تجاری دارد. برای آموزش کار با SQL Server باید دورههای آموزشی مربوط به این پایگاه داده محبوب و پرطرفدار را بگذرانید. این دورهها باید به شکلی باشند که تمام مراحل کار با SQL Server را از سطوح مبتدی تا پیشرفته آموزش دهند. در این صورت، برای ورود به بازار کار آماده میشوید.
یکی از بهترین موسسات آموزشی که فیلمهای بسیار مناسبی را برای آموزش کار با پایگاه داده SQL Server تولید کرده، وبسایت آموزشی فرادرس است. در فرادرس فیلمهای متنوعی برای آموزش SQL Server در سطوح مختلف علمی، از مبتدی تا حرفهای، تولید شدهاند. بنابراین، هر کسی با توجه به سطح علمی خود میتواند گزینه مناسب را انتخاب کند. از مزایای فیلمهای آموزشی فرادرس، به طور کل میتوان به کیفیت بالای علمی و ویدئویی دورهها، هزینه مقرون بهصرفه و عدم وجود محدودیت زمانی برای یادگیری توسط این فیلمها اشاره کرد.
در ادامه چند مورد از این فیلمهای آموزشی را برای مخاطبان محترم فهرست کردهایم.
- فیلم آموزش SQL Server دوره مقدماتی فرادرس
- فیلم آموزش SQL Server دوره تکمیلی فرادرس
- فیلم آموزش SQL Server دوره پیشرفته فرادرس
- فیلم آموزش کوئری نویسی پیشرفته در SQL Server فرادرس
- فیلم آموزش استفاده از جیسون JSON در SQL فرادرس
مثال هایی برای Trigger در SQL
در این قسمت از مطلب، روش کار با Trigger-ها را در نرمافزار پایگاه داده SQL Server یاد میگیریم. در ابتدای کار با استفاده از کدهای زیر جدولی را به نام Employee برای نگهداری مشخصات کارمندان فرضی ایجاد میکنیم. بعدا از این جدول برای کار با Trigger-های خود استفاده خواهیم کرد.
1CREATE TABLE Employee
2(
3 Id INT PRIMARY KEY,
4 Name VARCHAR(45),
5 Salary INT,
6 Gender VARCHAR(12),
7 DepartmentId INT
8)
بعد از اینکه جدول، ساخته شد با استفاده از کد INSERT در SQL به صورت زیر چند ردیف داده هم به آن اضافه میکنیم.
1INSERT INTO Employee VALUES (1,'Steffan', 82000, 'Male', 3),
2(2,'Amelie', 52000, 'Female', 2),
3(3,'Antonio', 25000, 'male', 1),
4(4,'Marco', 47000, 'Male', 2),
5(5,'Eliana', 46000, 'Female', 3)
با استفاده از دستور SELECT در SQL نیز میتوانیم صحت اجرای عملیات وارد کردن دادهها را به جدول بررسی کنیم.
1SELECT * FROM Employee;
با اجرای کد بالا جدول زیر به عنوان جواب در خروجی نمایش داده میشود.
سپس جدول دیگری هم به نام Employee_Audit_Test ایجاد میکنیم. از این جدول برای ذخیره خودکار اطلاعات مربوط به هر انتقال دادهای در هر عملیاتی مانند INSERT و UPDATE و DELETE در SQL استفاده خواهیم کرد.
1CREATE TABLE Employee_Audit_Test
2(
3Id int IDENTITY,
4Audit_Action text
5)
برای مثال، الان Trigger خواهیم ساخت که تمام اطلاعات مربوط به هر بار اجرای دستور INSERTدر جدول کارمندان Employeeرا ذخیره کند. Trigger طراحی شده، همه این اطلاعات را در جدول Employee_Audit_Test ذخیره خواهد کرد.
با کمک کدهای پیادهسازی شده در کادر زیر، Trigger مربوط به وارد کردن دادهها در جدول کارمند را میسازیم.
1CREATE TRIGGER trInsertEmployee
2ON Employee
3FOR INSERT
4AS
5BEGIN
6 Declare @Id int
7 SELECT @Id = Id from inserted
8 INSERT INTO Employee_Audit_Test
9 VALUES ('New employee with Id = ' + CAST(@Id AS VARCHAR(10)) + ' is added at ' + CAST(Getdate() AS VARCHAR(22)))
10END
بعد از اینکه Trigger خود را ایجاد کردیم، با کمک کد زیر تلاش میکنیم که رکوردی را به جدول Employeeوارد کنیم. این رکورد حاوی اطلاعات مربوط به کارمند فرضی است.
1INSERT INTO Employee VALUES (6,'Peter', 62000, 'Male', 3)
اگر خطایی در زمان اجرای کد رخ نداد، با استفاده از دستور SELECT ، رکوردهای نظارتی ذخیره شده را بررسی میکنیم. در نتیجه اجرای این دستور خروجی زیر به کاربر نمایش داده میشود.
الان میخواهیم Trigger دیگری را ایجاد کنیم. این Trigger باید اطلاعات مربوط به هربار اجرای عملیات DELETEبرای حذف داده از جدول کارمندان را ذخیره کند. طبق روال قبل، دادههای مورد نظر در جدول Employee_Audit_Test ذخیره خواهند شد.
با استفاده از کدهای موجود در کادر زیر، Trigger مورد نظر برای ذخیره اطلاعات مربوط به حذف دادهها را ایجاد میکنیم.
1CREATE TRIGGER trDeleteEmployee
2ON Employee
3FOR DELETE
4AS
5BEGIN
6 Declare @Id int
7 SELECT @Id = Id from deleted
8 INSERT INTO Employee_Audit_Test
9 VALUES ('An existing employee with Id = ' + CAST(@Id AS VARCHAR(10)) + ' is deleted at ' + CAST(Getdate() AS VARCHAR(22)))
10END
بعد از ساخته شدن Trigger، الان باید رکوردی را از جدول کارمندان Employeeحذف کنیم.
1DELETE FROM Employee WHERE Id = 2;
اگر در زمان اجرای دستور هیچ خطایی ایجاد نشد، SQL پیام زیر را در خروجی نمایش خواهد داد.
در نهایت هم بعد از اجرای دستور SELECTمیتوانیم رکوردهای نظارتی را به صورت زیر تماشا کنیم.
در کدهای مربوط به هر دو Trigger تعریف شده، باید به خط کدهای زیر توجه کنیم.
1SELECT @Id = Id from inserted
2SELECT @Id = Id from deleted
جداول مربوط به دادههای «حذف شده» inserted و «وارد شده» deleted ، جداول اختصاصی هستند. این جدولها توسط خود SQL Server ساخته و استفاده میشوند. وقتی که ردیفی را به جدول واقعی وارد میکنیم، اطلاعات مربوط به آن عمل وارد کردن در جدول insertedذخیره میشود. یعنی کپی از ردیف وارد شده را در خود نگهداری میکند. به همچنین جدول deletedهم کپی از هر ردیف حذف شده در جدول واقعی را در خود نگهداری میکند.
انواع Trigger های SQL Server
یکی از روشهای بسیار خوب یادگیری SQL، تماشای فیلمهای آموزشی است. از بین فیلمهای آموزشی گوناگون بهترین روش برای جمعبندی آموزشهای دیده شده استفاده از فیلمهایی است که به صورت پروژه محور به آموزش تکنولوژی خاصی میپردازند. به همین منظور فیلم آموزش پروژه محور ساخت دیکشنری برای دیتابیس با کمک پایگاه داده SQL Server از فرادرس را برای تماشا پیشنهاد میدهیم. در این نوع از فیلمها میتوانیم روش ترکیب تکنیکهای مختلف را با یکدیگر ببینیم. برای راحتی کار شما لینک مربوط به فیلم را نیز در ادامه قرار دادهایم.
میتوانیم Trigger-های SQL Server را به صورت اصلی در سه نوع گوناگون دستهبندی کنیم.
- Trigger-های مربوط به «زبان تعریف داده» (Data Definition Language | DDL)
- Trigger-های مربوط به «زبان دستکاری دادهها» (Data Manipulation Language | DML)
- «Trigger-های لازم برای دستورات آغاز برنامه» (Logon Triggers)
Trigger های DDL
Trigger-های DDL در زمان پاسخ به رویدادهای مربوط به DDL اجرا میشوند. از این قبیل رویدادها میتوان به عبارتهایی مانند CREATE و ALTER و DROP اشاره کرد. بسته به نوع رویدادههای DDL میتوانیم هر Trigger را در سطح پایگاه داده یا سرور ایجاد کنیم. همچنین میتوان Trigger-ها را در پاسخ به رویههای ذخیره شده مشخصی بهکار گرفت که توسط سیستم تعریف شدهاند. این رویهها خود، عملیاتی مانند DDL-ها انجام میدهند.
Trigger-های DDL به صورت ویژه در سناریوهایی مانند موارد زیر کاربرد دارند.
- وقتی که باید از اعمال تغییرات در اسکیما پایگاه داده جلوگیری کنیم.
- وقتی که باید به تغییرات حاصل شده در اسکیمای پایگاه داده نظارت کنیم.
- وقتی که لازم است به تغییرات اعمال شده در اسکیمای پایگاه داده پاسخ مناسبی برگردانیم.
Trigger های DML
Trigger-های DML در پاسخ به رویدادهای DML مانند INSERTو UPDATEو DELETEاجرا میشوند. رویدادهای DML نامبرده شده در جدول مربوط به کاربر یا بر روی ویو نمایش داده میشوند. همچنین در پاسخ به عملیاتی شبیه به DML که توسط رویههای ذخیره شده سیستمی اجرا میشوند نیز میتوان Trigger-های DML را اجرا کرد.
به صورت کلی، Trigger-های DML را میتوان در دو گروه زیر دستهبندی کرد.
- After Triggers
- Instead Of Triggers
After Triggers
Trigger-های After وقتی اجرا میشوند که SQL Server عملیات مرتبط با این Trigger را با موفقیت به پایان برساند. این نوع خاص از Trigger-ها به طور کلی بعد از اعمال یکی دستورات INSERTو UPDATEو DELETEبر روی جدول مرتبط به Trigger اجرا میشوند. به این دو نکته هم توجه کنید.
- Trigger-های After توسط ویوها پشتیبانی نمیشوند.
- بعضی وقتها به Trigger-های Trigger ،After-های FOR نیز گفته میشود.
به صورت دقیقتر میتوانیم این Trigger را در سه گروه زیر دستهبندی کنیم.
- Trigger بعد از دستور INSERT یا «AFTER INSERT Trigger»
- Trigger بعد از دستور UPDATE یا «AFTER UPDATE Trigger»
- Trigger بعد از دستور DELETE یا «AFTER DELETE Trigger»
مثال: وقتی که دادهای را در جدولی وارد میکنیم، Trigger که با عملیات مربوط به INSERTدر آن جدول مرتبط شده است، تا زمان برطرف شدن همه محدودیتها و شرایط مربوط به عملیات INSERTمانند محدودیت کلید اصلی، اجرا نمیشود. به عبارت دیگر، SQL Server نمیتواند After Trigger را زمانی اجرا کند که عملیات مربوط به واردکردن دادهها با شکست روبهرو شده است.
در کادر زیر میتوانیم پیادهسازی سینتکس مربوط به After Trigger را در نرمافزار SQL Server ببینیم.
1CREATE TRIGGER schema_name.trigger_name
2ON table_name
3AFTER {INSERT | UPDATE | DELETE}
4AS
5 BEGIN
6 -- Trigger Statements
7 -- Insert, Update, Or Delete Statements
8 END
Instead Of Triggers
Instead Of Trigger-ها قبل از اینکه SQL Server شروع به اجرای عملیات مرتبط با Trigger مورد نظر کند اجرا میشوند. به این معنا که قبل از اجرای Trigger مورد نظر نیاز به فراهم کردن هیچ شرط یا رفع کردن هیچ محدودیتی نیست. در نتیجه، حتی اگر بررسی محدودیتها ناموفق باشد، هنوز هم Trigger مورد نظر اجرا خواهد شد. این نوع از Trigger-ها دقیقا برعکس Trigger-های AFTER کار میکنند. میتوانیم Trigger-های INSTEAD OF را بر روی جدولی ایجاد کنیم که به خوبی کار میکند اما شامل عملیات واقعی جدول مانند INSERTو UPDATEو DELETEنمیشود.
به صورت دقیقتر میتوانیم این Trigger را در سه گروه زیر دستهبندی کنیم.
- Trigger در عوض دستور INSERT یا «INSTEAD OF INSERT Trigger»
- Trigger در عوض دستور UPDATE یا «INSTEAD OF UPDATE Trigger»
- Trigger در عوض دستور DELETE یا «INSTEAD OF DELETE Trigger»
مثال: وقتی که در جدولی داده وارد میکنیم. Trigger مرتبط با عملیات INSERTدر جدول پیش از اینکه داده همه محدودیتهای خود را برطرف کند، مانند محدودیت مربوط به کلید اصلی، اجرا خواهد شد. SQL Server این Trigger را حتی در صورت ناموفق بودن عملیات مربوط به دادهها هم اجرا میکند. یعنی حتی اگر به دلیل رفع نشدن شرایط مربوط به ورودی داده به جدول، عملیات INSERTشکست بخورد، باز هم Trigger مربوطه اجرا میشود.
دستور Insert یکی از دستورات کلیدی و بسیار مهم در SQL است. این دستور برای وارد کردن داده در جداول بهکار برده میشود. در صورتی که با این دستور آشنا نیستید پیشنهاد میکنیم که مطلب از کاربرد تا نحوه استفاده به زبان ساده دستور Insert در SQL را از مجله فرادرس مطالعه کنید تا به صورت کامل با همه قواعد و اصول استفاده از دستور مذکور آشنایی پیدا کنید.
در کادر زیر کدهای مربوط به تعریف Trigger-های INSTEAD OF در SQL Server نمایش داده شدهاند.
1CREATE TRIGGER schema_name.trigger_name
2ON table_name
3INSTEAD OF {INSERT | UPDATE | DELETE}
4AS
5 BEGIN
6 -- trigger statements
7 -- Insert, Update, or Delete commands
8 END
Trigger های Logon
Trigger-های Logon در پاسخ به رویدادهای مربوط به شروع کار سیستم یا ورود به سیستم اجرا میشوند. «رویدادهای مربوط به ورود» (LOGON events) زمانی رخ میدهند که کاربری در ارتباط با SQL Server اقدام به برقراری سشن کرده باشد. خود این کار نیز زمانی اتفاق میافتد که در هنگام ورود به سیستم فرایند تشخصی هویت کاربر با موفقیت به انجام رسیده ولی هنوز سشن مربوط به کاربر ایجاد نشده باشد. در نتیجه، جدول گزارشات خطای SQL Server همه پیامهای ایجاد شده توسط Trigger را نمایش خواهد داد. این پیامها شامل پیامهای خطا و پیامهای مربوط به عبارت PRINT نیز میشود. اما اگر فرایند تشخیص هویت با شکست روبهرو شود. یعنی کاربر به عنوان کاربر موجود یا مجاز شناخته نشود Trigger-های Logon اجرا نمیشوند. این نوع از Trigger-ها برای نظارت و کنترل سشنهای ایجاد شده توسط سرور بهکار برده میشوند. این عملیات شامل ردیابی فعالیتهای مربوط به ورود به سیستم یا محدود کردن تعداد سشنهای مربوط به اتصال خاصی نیز هستند.
چگونه Trigger ها را در SQL Server نمایش دهیم؟
وقتی تعداد خیلی زیادی پایگاه داده با چندین جدول مختلف داریم، نمایش یا فهرست کردن Trigger-ها بسیار مفید خواهد بود. در زمانی که نام جداول موجود در چندین پایگاه داده مختلف یکسان باشند، این کوئری به طرز بسیار چشمگیری کمک کننده است. با استفاده از کوئری نمایش داده شده در کادر زیر، میتوانیم لیستی از همه Trigger-های در دسترس در SQL Server را ببینیم.
1SELECT name, is_instead_of_trigger
2FROM sys.triggers
3WHERE type = 'TR';
اگر از نرم افزار «SQL Server Management Studio» استفاده کنیم، نمایش یا فهرست کردن همه Trigger-های در دسترس، بر روی هر جدول موجود، بسیار ساده خواهد بود. با دنبال کردن مراحل زیر بهسادگی میتوانیم این عملیات را انجام دهیم.
- به منو «Databases» میرویم. پایگاه داده مورد نظر را انتخاب کرده و سپس آن را باز میکنیم.
- منو «Tables» را انتخاب کرده و سپس آن را نیز باز میکنیم.
- در منو باز شده میتوانیم هر جدول را به صورت دلخواه باز کنیم.
در این بخش گزینههای بسیار زیادی وجود دارند. اما برای انجام کار مورد نظر خود باید گزینه Triggers را انتخاب کنیم. این گزینه همه Trigger-های در دسترس برای این جدول را نمایش میدهد.
چگونه Trigger ها را در SQL Server به روزرسانی کنیم؟
دادههای ذخیره شده در جدول به مرور زمان میتوانند تغییر کنند. در چنین مواردی، مدیران پایگاه داده هم باید تغییراتی را بر روی Trigger-ها اعمال کنند. این عملیات را در SQL Server به دو روش مختلف میتوان انجام داد.
- روش اول استفاده از تکنیکهای گرافیکی موجود در نرمافزار مدیریت پایگاه داده SQL Server است.
- روش دوم هم استفاده از فرمانها و کوئریهای خود SQL است.
دستکاری در Trigger ها با استفاده از نرم افزار مدیریت پایگاه داده SQL Server
برای اعمال تغییرات در Trigger-ها در ابتدای کار باید نرمافزار مورد نظر را - برای مثال SQL Server Management Studio - باز کرد. سپس طبق روال گفته شده قبلی اول به سراغ پایگاه داده رفته و بعد از آن جدولی که Trigger مورد نظر در آنجا ذخیره شده را پیدا میکنیم. الان بر روی Trigger که باید تغییر کرده یا بهروزرسانی شود راستکلیک میکنیم. در این صورت منو مربوط به ابزارهای در دسترس باز شده و میتوانیم گزینه «Modify» را در این منو انتخاب کنیم.
وقتی که گزینه «Modify» را انتخاب کنیم، پنجره جدیدی مخصوص نوشتن کوئریها باز میشود. در این پنجره به صورت خودکار کد مربوط به ALTER TRIGGER تولید شده و نمایش داده میشود. بعد از این اتفاق به راحتی میتوانیم کد نمایش داده شده را با توجه به خواستههای خود تغییر داده و بهروزرسانی کنیم.
اصلاح Trigger ها با استفاده از فرمان های SQL
از عبارت ALTER TRIGGER هم میتوانیم برای اعمال تغییر در Trigger-های استفاده کنیم. با کمک کوئری شبیه به مورد زیر، میتوانیم تغییرات مدنظر خود را بر روی Trigger-ها اعمال کنیم.
1ALTER TRIGGER [dbo].[triggers_in_sql]
2 ON [dbo].[EmployeeTable]
3 AFTER INSERT
4AS
5BEGIN
6 -- Modify as per your needs
7END
چگونه Trigger ها را در SQL Server حذف کنیم؟
با استفاده از عبارت DROP TRIGGER میتوانیم هر Trigger موجود را در SQL Server حذف کنیم. در زمان حذف کردن Trigger-ها از جدول باید بسیار با دقت عمل کنیم. زیرا هروقت که Trigger را حذف کنیم دیگر قابل بازیابی نیست. اگر Trigger پیدا نشد، عبارت DROP TRIGGER در خروجی پیغام خطا نمایش خواهد داد.
سینتکس پایین، Trigger-های DML را حذف میکند.
1DROP TRIGGER [IF EXISTS] schema_name.trigger_name;
اگر بخواهیم که در یک دفعه، بیشتر از یک Trigger را به صورت همزمان حذف کنیم، باید Trigger-ها را با استفاده از عملگر کاما از یکدیگر جدا کرده و در مقابل عبارت DROP TRIGGER نام ببریم.
1DROP TRIGGER schema_name.trigger_name1, trigger_name2.....n;
در ضمن، برای حذف کردن Trigger-های LOGON به صورت تکی یا گروهی، میتوانیم از عبارت DROP TRIGGER به صورت نمایش داده شده در پایین استفاده کنیم.
1DROP TRIGGER [ IF EXISTS ] trigger_name1, trigger_name2.....n
2ON { DATABASE | ALL SERVER };
حتی برای حذف کردن Trigger-های DDL به صورت تکی یا گروهی نیز میتوانیم از عبارت DROP TRIGGER استفاده کنیم. این بار هم باید این عبارت را به صورت زیر در کوئری به کار ببریم.
1DROP TRIGGER [ IF EXISTS ] trigger_name1, trigger_name2.....n
2ON ALL SERVER;
اگر از نرم افزار مدیریت پایگاه داده SQL Server Management Studio استفاده کنیم، تکنیک حذف کردن Trigger از جدولها بسیار سادهتر میشود. این کار را میتوانیم با پیروی از مراحل زیر انجام دهیم.
- در منوی اصلی مسیر «Databases -> Tables» را دنبال میکنیم. جدول مورد نظر را پیدا کرده و باز میکنیم.
- در گزینههای جدول Triggers را انتخاب کرده و باز میکنیم. سپس بر روی هر کدام از Trigger-های موجود میتوانیم راست کلیک کرده و بر روی گزینه «Delete» کلیک چپ میکنیم.
این گزینه، همه Trigger-های فعال در جدول انتخاب شده را نمایش میدهد. فقط باید بر روی Trigger مورد نظر راست کلیک کرده و در منوی آبشاری باز شده گزینه «Delete» را انتخاب کنیم. به همین سادگی میتوانیم هر کدام از Trigger-ها را حذف کنیم.
آشنایی با سایر پایگاه های داده موجود
نرمافزارهای پایگاه داده گوناگونی وجود دارند که از زبان SQL برای نگهداری، کار و مدیریت دادهها استفاده میکنند. هر کدام از این پایگاههای داده به منظور کار در نوع خاصی از پروژهها ارائه شدهاند. به عنوان مثال میتوانیم از برنامههایی مانند MySQL و SQLite و PostgreSQL و غیره نام ببریم. البته بعضی از آنها هم میتوانند انواع گوناگونی از برنامهها با اندازههای مختلف را پشتیبانی کنند.
برای کسب توانایی کار با سایر پایگاههای دادهی رابطهای که از زبان SQL استفاده میکنند، میتوان منابع خوبی در فرادرس پیدا کرد. آشنایی با اصول SQL مقدمهای برای آشنایی با پایگاههای داده بر مبنای SQL است. انواع گوناگون این پایگاههای داده، هر کدام در رابطه با نوع خاصی از زبانهای برنامهنویسی یا با توجه به نوع خاصی از پروژهها یا سختافزار در دسترس برتریهای خاصی دارند. گروه تولید محتوی آموزشی فرادرس برای تمام مخاطبان عزیز، فیلمهای آموزشی تخصصی متناسب با انواع پایگاههای داده را از سطوح ابتدایی تا سطوح حرفهای تهیه کرده که هر کدام به تنهایی برای آمادهسازی کاربر به منظور ورود به بازار کار کافی است.
در بخش زیر چند مورد از این فیلمهای آموزشی را فهرست کردهایم. این فیلمها بعضی از پایگاههای داده مختلف را پوشش میدهند. برای دیدن فیلمها آموزشی بیشتر، با کلیک بر روی تصویر بالا میتوانید وارد صفحه مربوط به مجموعه آموزش پایگاه داده فرادرس شوید.
- فیلم آموزش پایگاه داده MySQL فرادرس
- فیلم آموزش مقدماتی اوراکل اپکس، تولید و توسعه نرم افزارهای تحت وب با Oracle APEX در فرادرس
- فیلم آموزش پایگاه داده SQLite در پایتون با فرادرس
- فیلم آموزش پایگاه داده MongoDB برای تحلیل، مدل سازی و پردازش داده ها در فرادرس
- فیلم آموزش مقدماتی PostgreSQL برای مدیریت پایگاه داده در فرادرس
مزایا و معایب استفاده از Trigger در SQL
هر ابزاری که برای کمک به کار توسعهدهندگان تولید شده یا میشود دارای معایب و مزایای منحصر به خود است. دانستن این نکات کمک میکند که بتوانیم به بهترین صورت ممکن از ابزارها استفاده کرده و از آسیب دیدن برنامهها بخاطر استفاده غلط پیشگیری کنیم.
مزایای استفاده از Trigger
در این بخش مزایای مربوط به استفاده از Trigger-ها را به صورت فهرستوار بیان کردهایم.
- اجرای قوانین و Rollback-ها: Trigger-ها برای اشیا پایگاه داده قوانین خاصی را تعیین میکنند. حتی میتوانند با کمک ابزار خاصی تغییراتی را که با قوانین تعیین شده هماهنگ نباشند به عقب برگردانند. Trigger دادهها را بررسی میکند و تغییرات لازم را بر روی داده اعمال میکند.
- یکپارچگی دادهها: Trigger-ها با تضمین این مطلب که همه تغییرات رخ داده در جدول از قوانین خاصی تبعیت میکنند به اعمال یکپارچگی بر روی دادهها کمک میکنند.
- اعتبارسنجی دادهها: Trigger-ها دادهها را قبل از وارد شدن به جدول یا بهروزرسانی مقادیرشان اعتبارسنجی میکنند.
- ثبت سوابق رکوردها: Trigger-ها میتوانند برای نگهداری گزارشاتی درباره تغییر رکوردها به مدیران پایگاه داده کمک کنند.
- کارآمدی: از این رو که در هربار اجرا Trigger-ها نیازی به کامپایل کردن ندارند، میتوانند باعث افزایش کارآمدی کوئریها شوند.
- کاهش کدهای سمت کلاینت: Trigger-ها با کاهش کدهای سمت کلاینت، باعث صرفهجویی در مصرف زمان و کم کردن کار توسعهدهندگان میشوند.
- نگهداری ساده: نگهداری از Trigger-ها بسیار ساده است.
معایب استفاده از Trigger ها
در این قسمت از مطلب، معایب استفاده از Trigger-ها را به صورت فهرست نوشتهایم.
- محدود شده به اعتبارسنجیهای گسترده: Trigger-ها فقط امکان اعتبارسنجیهای گسترده را فراهم میکنند.
- اجرای نامرئی: Trigger به صورت خودکار فراخوانی میشود و فرایند اجرای آن برای کاربر به صورت نامرئی انجام میگیرد. به این دلیل، خطایابی اتفاقاتی که در لایه پایگاه داده میافتد برای توسعه دهندگان مشکل میشود.
- افزایش سرریز: Trigger-ها میتوانند باعث سرریز سرور پایگاه داده شوند.
- چندین فعالیت در یک Trigger :Trigger مجزایی را میتوان برای پاسخگویی به چندین رفتار کاربران تعریف کرد. یعنی در یک عبارت CREATE TRIGGER میتوانیم برای چندین عملیات کاربری مانند INSERTو UPDATEعکس العمل بنویسیم.
- محدودیت به تعریف در پایگاه داده: Trigger-ها را فقط میتوان در پایگاه داده فعلی تعریف کرد. اما Trigger-ها میتوانند به اشیا داده خارج از پایگاه داده حاضر نیز اشاره کنند.
جمع بندی
در این مطلب از مجله فرادرس آموختیم که Trigger در SQL چیست. انواع Trigger-ها را شناختیم و با تفاوتهای بین آنها آشنا شدیم. اکنون میدانیم که Trigger چگونه در SQL کار میکند. همچنین میتوانیم با کمک Trigger تمام فعالیتهای ورود، خروج و بهروزرسانی دادهها را کنترل کنیم و تحت نظارت قرار دهیم. همینطور میدانیم که چگونه Trigger-های مخصوصی را برای عملیات اصلی SQL مانند INSERTو UPDATEو DELETEپیادهسازی کنیم.
Trigger در SQL ابزار قدرتمندی برای کنترل خودکار بهروزرسانی دادهها در پایگاه داده است. به دلیل تاثیر زیاد Trigger-ها در کارآمدی پایگاه داده و کیفیت دادهها لازم است که با دقت و توجه کامل با آنها کار کرده و آنها را مدیریت کنیم. استفاده هر نوع از نرمافزارهای پایگاه داده که به صورت گرافیکی از Trigger-های SQL نیز پشتیبانی میکنند، یکی از بهترین راهها برای مدیریت مناسب و قوی Trigger-ها است.