SQL SERVER 2008

تجارب من در رابطه با SQL SERVER

توسعه و بهبود DDL برای Trigger
ساعت ۳:۱٤ ‎ب.ظ روز ۱۳۸٧/٩/۳٠  کلمات کلیدی: trigger ، ddl ، sql server 2008 ، rename

 

در 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