DDL triggers och SET-inställningar

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}

Tags:

SQL Server