Blog Post

DDL Triggers

,

We had a request from a developer who wanted to access data from a source database and another database on the same server. We needed to ensure that the underlying tables are not changed in a way that would impact on the view in either database

Prior to 2005 I would have to have done this using a myriad of views and the schemabinding option. Since SQL Server 2005 you can use DDL triggers to fire when certain DDL statements, like CREATE TABLE, ALTER TABLE, DROP TABLE are fired.

DDL triggers focus on changes to the definition of the database schema/object rather than actual data. DDL triggers can be scoped at database level and server level. The server scoped triggers apply to server objects such as logins and the former are database scoped and apply to database objects such as tables and indexes. The following trigger fires for every DROP TABLE or ALTER TABLE execution and stops any table changes being made without first disabling the trigger.

CREATE TRIGGER safety

ON DATABASE

FOR DROP_TABLE, ALTER_TABLE

AS

PRINT 'You must disable Trigger "safety" to drop or alter tables!'

ROLLBACK

Some may find this a little restrictive and may like to tie the trigger down to a particular table or object...This takes a little more invention:

CREATE TRIGGER Trg_Specific_Object ON DATABASE

FOR alter_table

AS

DECLARE @data XML

SET @data = EVENTDATA()

DECLARE @ObjectName NVARCHAR(100)

SET @ObjectName = 'DDL_Test'

DECLARE @object nvarchar(100)

SET @object = @data.value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(100)')

PRINT 'Altering object :' + @object

IF @Object = @ObjectName

BEGIN

PRINT 'Alter schema not allowed on this database - disable the DDL trigger'

ROLLBACK;

END

In the above statement the trigger fires for each ALTER statement BUT it will only rollback the DDL statement if it includes the object specified.

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating