توسعه و بهبود DDL برای Trigger
در sql server 2008 ، trigger ها طوری تغییر کرده اند که از آنها به عنوان DDL میشود استفاده کرد مثلا یک table جدید در آن ساخته شود. با این تغییر انعطاف بسیار بالایی به trigger ها داده شده است. شمای XML برای رخدادها به عنوان بخشی از database engine در مسیر
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd
نصب شده و همچنین از آدرس زیر قابل دریافت است.
http://schemas.microsoft.com/sqlserver
خیلی از stored procedure ها اعمال تعریف داده(DDL) انجام میدهند. قبل از sql server 2008 ، شما نمیتوانستید با یک trigger ساختار داده ای جدیدی تعریف کنید. اکنون شما میتوانید رویدادهایی را راه اندازی کنید که درآنها کارهایی شبیه PROCEDURE انجام دهید. به عنوان مثال، stored procedure با نام sp_rename یک trigger را که در رویداد RENAME جدید ساخته شده است راه اندازی و اجرا میکند. برای نمایش این نوع از trigger، کد زیر یک database با نام testdb و در آن یک trigger روی رویداد RENAME برای چاپ منبع و جزییات هدف را جهت تست میسازد.
USE master;
GO
IF DB_ID(‹testdb›) IS NOT NULL DROP DATABASE testdb;
CREATE DATABASE testdb;
GO
USE testdb;
GO
CREATE TRIGGER trg_testdb_rename ON DATABASE FOR RENAME
AS
DECLARE
@SchemaName AS SYSNAME =
EVENTDATA().value(‹(/EVENT_INSTANCE/SchemaName)[1]›, ‹sysname›),
@TargetObjectName AS SYSNAME =
EVENTDATA().value(‹(/EVENT_INSTANCE/TargetObjectName)[1]›, ‹sysname›),
@ObjectName AS SYSNAME =
EVENTDATA().value(‹(/EVENT_INSTANCE/ObjectName)[1]›, ‹sysname›),
@NewObjectName AS SYSNAME =
EVENTDATA().value(‹(/EVENT_INSTANCE/NewObjectName)[1]›, ‹sysname›);
DECLARE
@msg AS NVARCHAR(1000) =
N’RENAME event occurred.
SchemaName: ‹ + @SchemaName + N›
TargetObjectName: ‹ + @TargetObjectName + N›
ObjectName: ‹ + @ObjectName + N›
NewObjectName: ‹ + @NewObjectName;
PRINT @msg;
GO
برای تستtrigger کد زیر یک table با نام dbo.T1 با یک ستون که col1 نامیده میشود میسازد و sp_rename را برای تغییر نام ستون به col2 اجرا میکند :
CREATE TABLE dbo.T1(col1 INT);
EXEC sp_rename ‹dbo.T1.col1›, ‹col2›, ‹COLUMN›;
Trigger روی رویداد RENAME فراخوانی شده و پیام زیر را چاپ میکند :
RENAME event occurred.
SchemaName: dbo
TargetObjectName: T1
ObjectName: col1
NewObjectName: col2
ممنون مسعود جان دستت درد نکنه عالي بود