sql - Instead of Trigger for Insert on all tables -


can please provide source on how write generic instead of trigger insert tables in database. want run stored procedure create instead of insert triggers tables in db .

without understanding why want instead of trigger on every single table, , else plan in resulting code aside insert supplied values base table (just have happened if there no instead of trigger @ all), here came with. you'll note drops trigger if exists, can run multiple times in same database without "already exists" errors. ignores identity, rowguidcol, computed columns, , timestamp/rowversion columns. @ end show how can inspect, instead of execute (which commented out) output script (up 8k), , cast xml if want see more (up 64k). no guarantees can return whole thing in ssms depending on how many tables/columns there are. if want check and/or run manually may want create table stores value - can pull out app or have you. if want execute automatically can follow yuck's point - save stored procedure , create ddl trigger responds ddl events (create table etc).

set nocount on;  declare      @cr varchar(2) = char(13) + char(10),     @t  varchar(1) = char(9),     @s  nvarchar(max) = n'';  ;with t (     select [object_id],       s = object_schema_name([object_id]),      n = object_name([object_id])     sys.tables is_ms_shipped = 0      ) select @s += 'if object_id(''dbo.iotrigger_' + t.s + '_' + t.n + ''') not null     drop trigger [dbo].[iotrigger_' + t.s + '_' + t.n + ']; g' + 'o create trigger iotrigger_' + t.s + '_' + t.n + '     on ' + quotename(t.s) + '.' + quotename(t.n) + '     instead of insert  begin     set nocount on;      -- surely must want put other code here?      insert ' + quotename(t.s) + '.' + quotename(t.n) + '     ( ' +  (     select @t + @t + name + ',' + @cr         sys.columns c         c.[object_id] = t.[object_id]         , is_identity = 0         , is_rowguidcol = 0         , is_computed = 0     , system_type_id <> 189     xml path(''), type ).value('.[1]', 'nvarchar(max)') + '--'  + @cr + @t + ')' + @cr + @t + 'select  ' +  (     select @t + @t + name + ',' + @cr         sys.columns c         c.[object_id] = t.[object_id]         , is_identity = 0         , is_rowguidcol = 0         , is_computed = 0     , system_type_id <> 189     xml path(''), type ).value('.[1]', 'nvarchar(max)') + '--' + @cr + @t + 'from         inserted; end' + @cr + 'g' + 'o' + @cr t order t.s, t.n;  select @s = replace(@s, ',' + @cr + '--' + @cr, @cr);  -- can inspect @ least part of script running -- following in text mode:  select @s;  -- if want see more of whole thing (but not -- whole thing), run in grid mode , click on result:  select convert(xml, @s); 

a couple of caveats:

1) don't deal sparse columns, xml collections, filestream etc. if have fancy tables might run complications of features.

2) name of trigger isn't "protected" - have schema called foo, schema called foo_bar, , table in foo called bar_none , table in foo_bar called none. lead duplicate trigger name because use underscore separator. complained cdc they closed bug won't fix. keep in mind if happen use schemas underscores.


Comments

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -