معرفی و استفاده از DDL Triggers در SQL Server
نویسنده: محمد رجبی
تاریخ: ۱۳۹۳/۰۲/۰۳ ۱۱:۵۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
create trigger Prevent_AlterDrop on database for drop_table, alter_table as print 'table can not be dropped or altered' rollback transaction
CREATE TABLE ddl_log
(
EventType nvarchar(100),
PostTime datetime,
SPID nvarchar(100),
ServerName nvarchar(100),
LoginName nvarchar(100),
UserName nvarchar(100),
DatabaseName nvarchar(100),
ObjectName nvarchar(100),
ObjectType nvarchar(100),
DefaultSchema nvarchar(100),
[SID] nvarchar(100),
TSQLCommand nvarchar(2000)); CREATE TRIGGER [Log] ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @data XML
SET @data = EVENTDATA()
INSERT INTO ddl_log
VALUES (
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime'),
@data.value('(/EVENT_INSTANCE/SPID)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/ServerName)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/UserName)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/DefaultSchema)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/SID)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)'));
در صورت فعال شدن Trigger میتوان برخی موارد مانند محدودیت زمانی، کاربر اجرا کننده و ... را اضافه نمود. برای مثال در دستور زیر اجازه تغییرات در این زمان ( بین 7:00 A.M. تا .8:00 P.M ) امکان پذیر نیست و در صورت اقدام پیغام خطا دریافت میکنید و دستورات Create لغو خواهند شد و اگر خارج از زمان فوق دستورات DDL را اجرا کنید دستورات به طور موفقیت آمیز اجرا میشود و البته تغییرات نیز Log میشوند.
پس از Overrdie کردن میتوانید مجدداً Trigger را فعال کنید:
برای مشاهده جزئیات بیشتر میتوانید به این لینک مراجعه کنید.
DDL_SERVER_LEVEL_EVENTS
DDL_LINKED_SERVER_EVENTS
DDL_LINKED_SERVER_LOGIN_EVENTS
DDL_REMOTE_SERVER_EVENTS
DDL_EXTENDED_PROCEDURE_EVENTS
DDL_MESSAGE_EVENTS
DDL_ENDPOINT_EVENTS
DDL_SERVER_SECURITY_EVENTS
DDL_LOGIN_EVENTS
DDL_GDR_SERVER_EVENTS
DDL_AUTHORIZATION_SERVER_EVENT Database Level
DDL_TABLE_VIEW_EVENTS
DDL_TABLE-EVENTS
DDL_VIEW_EVENTS
DDL_INDEX_EVENTS
DDL_STATISTICS_EVENTS
DDL_DATABASE_SECURITY_EVENTS
DDL_CERTIFICATE_EVENTS
DDL_USER_EVENTS
DDL_ROLE_EVENTS
DDL_APPLICATION_ROLE_EVENTS
DDL_SCHEMA_EVENTS
DDL_GDR_DATABASE_EVENTS
DDL_AUTHORIZATION_DATABASE_EVENTS
DDL_FUNCTION_EVENTS
DDL_PROCEDUER_EVENTS
DDL_TRIGGER_EVENTS
DDL_PARTITION_EVENTS
DDL_PARTITION_FUNCTION_EVENTS
DDL_PARTITION_SCHEME_EVENTS
DDL_SSB_EVENTS
DDL_MESSAGE_TYPE_EVENTS
DDL_CONTRACT_EVENTS
DDL_QUEUE_EVENTS
DDL_SERVER_EVENTS
DDL_ROUTE_EVENTS
DDL_REMOTE_SERVICE_BINDING_EVENTS
DDL_XML_SCHEMA_COLEECTION_EVENTS
DDL_FULLTEXT_CATALOG_EVENTS
DDL_DEFAULT_EVENTS
DDL_EXTENDED_PROPERTY_EVENTS
DDL_PLAN_GUIDE_EVENTS
DDL_RULE_EVENTS
DDL_SYNONYM_EVENTS
DDL_EVENT_NOTIFICATION_EVENTS
DDL_ASSEMBLY_EVENTS
DDL_TYPE_EVENTS
| Action group name | Event Class | Description |
| BACKUP_RESTORE_GROUP | Audit Backup/Restore | یک دستور Backup یا Restore صادر شود |
ALTER TRIGGER [dbo].[Prevent_Befor_Insert_Null]
ON [dbTest].[dbo].[tblTest]
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
IF OBJECT_ID(N'dbTest.dbo.tblTest.FirstName') is null
BEGIN
DECLARE @Id int
SET @Id = (select Id from inserted)
RAISERROR ('مقدار فیلد نام نباید خالی باشد',16,1)
ROLLBACK
END
END