by Martin
19. June 2012 15:23
DDL-triggers är ju ett utmärkt sätt att t ex logga vad som händer i databasen. Jag har dock vid ett antal tillfällen lyckats få felmeddelanden som härrör från en DDL-trigger när jag t ex skapat en tabell. Man kan då få ett felmeddelande i stil med nedanstående:
{{
Failed execute DDL trigger:INSERT failed because the following SET options have incorrect
settings: 'ANSI_PADDING'. Verify that SET options are correct for use with indexed views
and/or indexes on computed columns and/or filtered indexes and/or query notifications
and/or XML data type methods and/or spatial index operations.
}}
Det tog sin lilla tid att lura ut vad problemet var. Det visade sig att om du använder XQuery i din DDL-trigger, t ex enligt nedanstående exempel, så måste vissa inställningar vara satta.
{code:sql}
SELECT 'EventType' = EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(128)')
, 'Server' = EVENTDATA().value('(/EVENT_INSTANCE/ServerName)[1]','nvarchar(128)')
, 'Database' = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(128)')
, 'Schema' = EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]','nvarchar(128)')
, 'Object' = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(128)')
, 'ObjectType' = EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]','nvarchar(128)')
, 'Login' = EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]','nvarchar(128)')
, 'Command' = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
, 'Time' = EVENTDATA().value('(/EVENT_INSTANCE/PostTime)[1]','datetime')
{code:sql}
De inställningar du då måste göra i din ddl-trigger för att det ska lira bra är följande:
{code:sql}
SET ANSI_PADDING ON
SET ANSI_NULLS ON
SET ANSI_WARNINGS ON
SET QUOTED_IDENTIFIER ON
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT OFF
{code:sql}