[{"data":1,"prerenderedAt":680},["ShallowReactive",2],{"article-sql-server-triggers-to-mirror-a-table":3},{"article":4,"tags":358,"previous":386,"next":534},{"id":5,"title":6,"author":7,"body":8,"createdAt":346,"description":347,"extension":348,"img":349,"meta":350,"navigation":351,"path":352,"seo":353,"stem":354,"tags":355,"updatedAt":346,"__hash__":357},"articles\u002Farticles\u002Fsql-server-triggers-to-mirror-a-table.md","SQL Server Triggers To Mirror a Table","[object Object]",{"type":9,"value":10,"toc":344},"minimark",[11,19,97,100,327,330,340],[12,13,14,15,18],"p",{},"I had a need to mirror any changes to one Sql Server table to another Sql Server table of a different name. Both tables had similar columns and types. In this sample my table is called Dave_Test and my mirror table was Dave_Test_Audit.",[16,17],"br",{},"\nI will provide the create table structures in the event you want to replicate my code.",[20,21,26],"pre",{"className":22,"code":23,"language":24,"meta":25,"style":25},"language-sql shiki shiki-themes github-light github-dark","CREATE TABLE [Dave_Test]( \n    [Emp_ID] [int] IDENTITY(1,1) NOT NULL, \n    [Emp_name] [varchar](100) NULL, \n    [Emp_Sal] [decimal](10, 2) NULL ) ON [PRIMARY]  \n   \nCREATE TABLE [Dave_Test_Audit](\n    [Emp_ID] [int] NULL,\n    [Emp_name] [varchar](100) NULL,\n    [Emp_Sal] [decimal](18, 0) NULL\n) ON [PRIMARY]  \nGO  \n","sql","",[27,28,29,37,43,49,55,61,67,73,79,85,91],"code",{"__ignoreMap":25},[30,31,34],"span",{"class":32,"line":33},"line",1,[30,35,36],{},"CREATE TABLE [Dave_Test]( \n",[30,38,40],{"class":32,"line":39},2,[30,41,42],{},"    [Emp_ID] [int] IDENTITY(1,1) NOT NULL, \n",[30,44,46],{"class":32,"line":45},3,[30,47,48],{},"    [Emp_name] [varchar](100) NULL, \n",[30,50,52],{"class":32,"line":51},4,[30,53,54],{},"    [Emp_Sal] [decimal](10, 2) NULL ) ON [PRIMARY]  \n",[30,56,58],{"class":32,"line":57},5,[30,59,60],{},"   \n",[30,62,64],{"class":32,"line":63},6,[30,65,66],{},"CREATE TABLE [Dave_Test_Audit](\n",[30,68,70],{"class":32,"line":69},7,[30,71,72],{},"    [Emp_ID] [int] NULL,\n",[30,74,76],{"class":32,"line":75},8,[30,77,78],{},"    [Emp_name] [varchar](100) NULL,\n",[30,80,82],{"class":32,"line":81},9,[30,83,84],{},"    [Emp_Sal] [decimal](18, 0) NULL\n",[30,86,88],{"class":32,"line":87},10,[30,89,90],{},") ON [PRIMARY]  \n",[30,92,94],{"class":32,"line":93},11,[30,95,96],{},"GO\n",[12,98,99],{},"Here are my insert, update and delete triggers.",[20,101,103],{"className":22,"code":102,"language":24,"meta":25,"style":25},"Create TRIGGER [Dave_Test_Trigger_Delete]   \n   ON  [Dave_Test]   \n   AFTER DELETE  \nAS  \nBEGIN  \n     SET NOCOUNT ON;  \n     DELETE FROM Dave_Test_Audit   \n            WHERE emp_id IN (SELECT emp_id FROM deleted)  \nEND  \n  \nCreate TRIGGER [Dave_Test_Trigger_Insert]   \n   ON  [Dave_Test]   \n   AFTER INSERT  \nAS  \nBEGIN     SET NOCOUNT ON;  \n        INSERT INTO Dave_Test_Audit   \n         SELECT * FROM inserted END  \nEND  \n  \nCREATE TRIGGER [[Dave_Test_Trigger_Update]   \n   ON  [Dave_Test]   \n   AFTER UPDATE  \nAS  \nBEGIN  \n        SET NOCOUNT ON;  \n        IF EXISTS(SELECT * FROM Dave_Test_Audit a JOIN inserted AS i ON a.emp_id=i.emp_id)          \n        BEGIN  \n              UPDATE  Dave_Test_Audit   \n                SET emp_id = i.emp_id,  \n                emp_name = i.emp_name,  \n                emp_sal =  i.emp_sal  \n                FROM inserted i WHERE Dave_Test_Audit.emp_id=i.emp_id           \n              \n        END  \n        ELSE  \n             BEGIN  \n             INSERT INTO Dave_Test_Audit   \n                SELECT * FROM inserted   \n        END        \nEND\n",[27,104,105,110,115,120,125,130,135,140,145,150,155,160,165,171,176,182,188,194,199,204,210,215,221,226,231,237,243,249,255,261,267,273,279,285,291,297,303,309,315,321],{"__ignoreMap":25},[30,106,107],{"class":32,"line":33},[30,108,109],{},"Create TRIGGER [Dave_Test_Trigger_Delete]   \n",[30,111,112],{"class":32,"line":39},[30,113,114],{},"   ON  [Dave_Test]   \n",[30,116,117],{"class":32,"line":45},[30,118,119],{},"   AFTER DELETE  \n",[30,121,122],{"class":32,"line":51},[30,123,124],{},"AS  \n",[30,126,127],{"class":32,"line":57},[30,128,129],{},"BEGIN  \n",[30,131,132],{"class":32,"line":63},[30,133,134],{},"     SET NOCOUNT ON;  \n",[30,136,137],{"class":32,"line":69},[30,138,139],{},"     DELETE FROM Dave_Test_Audit   \n",[30,141,142],{"class":32,"line":75},[30,143,144],{},"            WHERE emp_id IN (SELECT emp_id FROM deleted)  \n",[30,146,147],{"class":32,"line":81},[30,148,149],{},"END  \n",[30,151,152],{"class":32,"line":87},[30,153,154],{},"  \n",[30,156,157],{"class":32,"line":93},[30,158,159],{},"Create TRIGGER [Dave_Test_Trigger_Insert]   \n",[30,161,163],{"class":32,"line":162},12,[30,164,114],{},[30,166,168],{"class":32,"line":167},13,[30,169,170],{},"   AFTER INSERT  \n",[30,172,174],{"class":32,"line":173},14,[30,175,124],{},[30,177,179],{"class":32,"line":178},15,[30,180,181],{},"BEGIN     SET NOCOUNT ON;  \n",[30,183,185],{"class":32,"line":184},16,[30,186,187],{},"        INSERT INTO Dave_Test_Audit   \n",[30,189,191],{"class":32,"line":190},17,[30,192,193],{},"         SELECT * FROM inserted END  \n",[30,195,197],{"class":32,"line":196},18,[30,198,149],{},[30,200,202],{"class":32,"line":201},19,[30,203,154],{},[30,205,207],{"class":32,"line":206},20,[30,208,209],{},"CREATE TRIGGER [[Dave_Test_Trigger_Update]   \n",[30,211,213],{"class":32,"line":212},21,[30,214,114],{},[30,216,218],{"class":32,"line":217},22,[30,219,220],{},"   AFTER UPDATE  \n",[30,222,224],{"class":32,"line":223},23,[30,225,124],{},[30,227,229],{"class":32,"line":228},24,[30,230,129],{},[30,232,234],{"class":32,"line":233},25,[30,235,236],{},"        SET NOCOUNT ON;  \n",[30,238,240],{"class":32,"line":239},26,[30,241,242],{},"        IF EXISTS(SELECT * FROM Dave_Test_Audit a JOIN inserted AS i ON a.emp_id=i.emp_id)          \n",[30,244,246],{"class":32,"line":245},27,[30,247,248],{},"        BEGIN  \n",[30,250,252],{"class":32,"line":251},28,[30,253,254],{},"              UPDATE  Dave_Test_Audit   \n",[30,256,258],{"class":32,"line":257},29,[30,259,260],{},"                SET emp_id = i.emp_id,  \n",[30,262,264],{"class":32,"line":263},30,[30,265,266],{},"                emp_name = i.emp_name,  \n",[30,268,270],{"class":32,"line":269},31,[30,271,272],{},"                emp_sal =  i.emp_sal  \n",[30,274,276],{"class":32,"line":275},32,[30,277,278],{},"                FROM inserted i WHERE Dave_Test_Audit.emp_id=i.emp_id           \n",[30,280,282],{"class":32,"line":281},33,[30,283,284],{},"              \n",[30,286,288],{"class":32,"line":287},34,[30,289,290],{},"        END  \n",[30,292,294],{"class":32,"line":293},35,[30,295,296],{},"        ELSE  \n",[30,298,300],{"class":32,"line":299},36,[30,301,302],{},"             BEGIN  \n",[30,304,306],{"class":32,"line":305},37,[30,307,308],{},"             INSERT INTO Dave_Test_Audit   \n",[30,310,312],{"class":32,"line":311},38,[30,313,314],{},"                SELECT * FROM inserted   \n",[30,316,318],{"class":32,"line":317},39,[30,319,320],{},"        END        \n",[30,322,324],{"class":32,"line":323},40,[30,325,326],{},"END\n",[12,328,329],{},"So why does my Update trigger deal with inserts?  The master table (Dave_Test) already had rows existing before the triggers were created.  With the update trigger managing inserting and updating records if the record is updated and does yet belong in the master audit table then the recently updated row will be inserted into the audit table for us.",[12,331,332,333,339],{},"For those old enough – this is ",[334,335,338],"a",{"href":336,"target":337},"http:\u002F\u002Fwww.happytrails.org\u002Ftrigger.html","_blank","Trigger"," (the smartest horse in the movies)",[341,342,343],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":25,"searchDepth":39,"depth":39,"links":345},[],"2016-02-13T07:02:53.5100000-05:00","I had a need to mirror any changes to one Sql Server table to another Sql Server table of a different name.  Read on.","md","\u002Farticles\u002Fimages\u002FXp0SJTsB7n.png",{},true,"\u002Farticles\u002Fsql-server-triggers-to-mirror-a-table",{"title":6,"description":347},"articles\u002Fsql-server-triggers-to-mirror-a-table",[24,356],"sqlserver","oG-qazOpjUVf0yb-VL3IN5WX57TFCezPsA53rRrA00k",[359,373],{"id":360,"title":361,"body":362,"description":366,"extension":348,"img":367,"meta":368,"name":24,"navigation":351,"path":369,"seo":370,"stem":371,"__hash__":372},"tags\u002Ftags\u002Fsql.md","Sql",{"type":9,"value":363,"toc":364},[],{"title":25,"searchDepth":39,"depth":39,"links":365},[],"SQL is a standard language designed for managing data in relational database management system. SQL stands for Structured Query Language. SQL is a standard programming language specifically designed for storing, retrieving, managing or manipulating the data inside a relational database management system (RDBMS).","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1598313183973-4effcded8d5e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=675&q=80",{},"\u002Ftags\u002Fsql",{"description":366},"tags\u002Fsql","HleFpAIKGUPMxp855dHtmfuv32MNyIbaOTi0ZjW_I1k",{"id":374,"title":375,"body":376,"description":380,"extension":348,"img":367,"meta":381,"name":356,"navigation":351,"path":382,"seo":383,"stem":384,"__hash__":385},"tags\u002Ftags\u002Fsqlserver.md","Sqlserver",{"type":9,"value":377,"toc":378},[],{"title":25,"searchDepth":39,"depth":39,"links":379},[],"SQL Server is a relational database management system, or RDBMS, developed and marketed by Microsoft.",{},"\u002Ftags\u002Fsqlserver",{"description":380},"tags\u002Fsqlserver","pSzcNnE-XyUgq8RlgK2xBpbJV7_7o5NLS2XlwBxFyAg",{"id":387,"title":388,"author":7,"body":389,"createdAt":526,"description":527,"extension":348,"img":409,"meta":528,"navigation":351,"path":529,"seo":530,"stem":531,"tags":532,"updatedAt":526,"__hash__":533},"articles\u002Farticles\u002Fgenerate-insert-update-delete-trigger-for-table-audit.md","Generate Insert, Update, Delete Trigger for Table Audit",{"type":9,"value":390,"toc":524},[391,397,414,417,427,522],[12,392,393,394,396],{}," ",[16,395],{},"\nThe following script will evaluate the table specified @TableName (you provide below), create a new table with {name}_Audit and also create insert, update and delete triggers.  In my example my table was Dave_Test in scheme engis.",[12,398,399,400,402],{},"Here is a screen shot of the end result audit table with the same columns PLUS 2 additional columns to document the action executed against the source table.",[16,401],{},[334,403,405],{"href":404},"\u002Farticles\u002Fimages\u002Fwindows-live-writer-generate-insert-update-delete-trigger-fo_9e1f-image_2.png",[406,407],"img",{"style":408,"src":409,"border":410,"alt":411,"title":411,"width":412,"height":413},"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;","\u002Farticles\u002Fimages\u002Fwindows-live-writer-generate-insert-update-delete-trigger-fo_9e1f-image_thumb.png",0,"image",521,109,[12,415,416],{},"Here you can see the created _Audit table and newly created _Trigger_Delete, _Trigger_Insert and _Trigger_Update",[12,418,419],{},[334,420,422],{"href":421},"\u002Farticles\u002Fimages\u002Fwindows-live-writer-generate-insert-update-delete-trigger-fo_9e1f-image_6.png",[406,423],{"style":408,"src":424,"border":410,"alt":411,"title":411,"width":425,"height":426},"\u002Farticles\u002Fimages\u002Fwindows-live-writer-generate-insert-update-delete-trigger-fo_9e1f-image_thumb_2.png",240,183,[20,428,430],{"className":22,"code":429,"language":24,"meta":25,"style":25},"SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO  \nDECLARE @TableName VARCHAR(200); \nSET @TableName = 'dave_test'; \n-- SET NOCOUNT ON added to prevent extra result sets from \n-- interfering with SELECT statements. \nSET NOCOUNT ON; \n--DECLARE @TABLENAME varchar(100) \nDECLARE @SCHEMA VARCHAR(100); \n--SET @TABLENAME = N'Company' SET @SCHEMA = N'engis';\nDECLARE @Done BIT;\nSET @Done = 0 DECLARE @CRLF CHAR(2);\nSET @CRLF = CHAR(10); DECLARE @SQL VARCHAR(2000); \nSET @SQL = 'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[' + @SCHEMA + '].[' + @TableName + '_Audit]'') AND type in (N''U'')) DROP TABLE [' + @SCHEMA + '].[' + @TableName + '_Audit] CREATE TABLE [' + @SCHEMA + '].[' + @TableName + '_Audit] (' + @CRLF; DECLARE @COLUMNID INT; SET @COLUMNID = 0; DECLARE @COLUMNNAME VARCHAR(1000); DECLARE @COLUMNTYPE VARCHAR(100); DECLARE @COLUMNSIZE INT; WHILE @Done = 0 BEGIN SELECT TOP 1 @COLUMNID = clmns.column_id , @COLUMNNAME = clmns.name , @COLUMNTYPE = usrt.name , @COLUMNSIZE = CAST(CASE WHEN baset.name IN ( N'nchar', N'nvarchar' ) AND clmns.max_length &lt;&gt; -1 THEN clmns.max_length \u002F 2 ELSE clmns.max_length END AS INT) FROM sys.tables AS tbl INNER JOIN sys.all_columns AS clmns ON clmns.object_id = tbl.object_id LEFT OUTER JOIN sys.types AS usrt ON usrt.user_type_id = clmns.user_type_id LEFT OUTER JOIN sys.types AS baset ON baset.user_type_id = clmns.system_type_id AND baset.user_type_id = baset.system_type_id WHERE ( tbl.name = @TableName AND SCHEMA_NAME(tbl.schema_id) = @SCHEMA ) AND clmns.column_id &gt; @COLUMNID ORDER BY clmns.column_id ASC; IF @@rowcount = 0 BEGIN SET @Done = 1; END; ELSE BEGIN SET @SQL = @SQL + ' [' + @COLUMNNAME + '] [' + @COLUMNTYPE + '] '; IF ( @COLUMNTYPE = 'nchar' OR @COLUMNTYPE = 'nvarchar' OR @COLUMNTYPE = 'varchar' ) SET @SQL = @SQL + '(' + LTRIM(STR(@COLUMNSIZE)) + ') '; \nSET @SQL = @SQL + 'NULL, ' + @CRLF; END; END; SET @SQL = @SQL + ' [' + @TableName + 'UpdateDate] datetime, [' + @TableName + 'UpdateAction] nvarchar(10) ) '; --print @SQL EXEC (@SQL);\nSET @SQL = ' IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''[' + @SCHEMA + '].[' + @TableName + '_Trigger_Update]'')) DROP TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Update] IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''[' + @SCHEMA + '].[' + @TableName + '_Trigger_Delete]'')) DROP TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Delete] IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''[' + @SCHEMA + '].[' + @TableName + '_Trigger_Insert]'')) DROP TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Insert] '; --print @SQL EXEC(@SQL); SET @SQL = 'CREATE TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Update] ON [' + @SCHEMA + '].[' + @TableName + '] AFTER UPDATE AS BEGIN SET NOCOUNT ON; INSERT INTO ' + @TableName + '_Audit SELECT *,getdate(),''Update'' FROM inserted END '; EXEC (@SQL); --print @SQL SET @SQL = 'CREATE TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Delete] ON [' + @SCHEMA + '].[' + @TableName + '] AFTER DELETE AS BEGIN SET NOCOUNT ON; INSERT INTO ' + @TableName + '_Audit SELECT *,getdate(),''Delete'' FROM deleted END ';\n\nEXEC (@SQL); --print @SQL SET @SQL = 'CREATE TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Insert] ON [' + @SCHEMA + '].[' + @TableName + '] AFTER INSERT AS BEGIN SET NOCOUNT ON; INSERT INTO ' + @TableName + '_Audit SELECT *,getdate(),''Insert'' FROM inserted END '; EXEC (@SQL);\n--print @SQL\n",[27,431,432,437,442,447,452,457,462,467,472,477,482,487,492,497,502,507,512,517],{"__ignoreMap":25},[30,433,434],{"class":32,"line":33},[30,435,436],{},"SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO  \n",[30,438,439],{"class":32,"line":39},[30,440,441],{},"DECLARE @TableName VARCHAR(200); \n",[30,443,444],{"class":32,"line":45},[30,445,446],{},"SET @TableName = 'dave_test'; \n",[30,448,449],{"class":32,"line":51},[30,450,451],{},"-- SET NOCOUNT ON added to prevent extra result sets from \n",[30,453,454],{"class":32,"line":57},[30,455,456],{},"-- interfering with SELECT statements. \n",[30,458,459],{"class":32,"line":63},[30,460,461],{},"SET NOCOUNT ON; \n",[30,463,464],{"class":32,"line":69},[30,465,466],{},"--DECLARE @TABLENAME varchar(100) \n",[30,468,469],{"class":32,"line":75},[30,470,471],{},"DECLARE @SCHEMA VARCHAR(100); \n",[30,473,474],{"class":32,"line":81},[30,475,476],{},"--SET @TABLENAME = N'Company' SET @SCHEMA = N'engis';\n",[30,478,479],{"class":32,"line":87},[30,480,481],{},"DECLARE @Done BIT;\n",[30,483,484],{"class":32,"line":93},[30,485,486],{},"SET @Done = 0 DECLARE @CRLF CHAR(2);\n",[30,488,489],{"class":32,"line":162},[30,490,491],{},"SET @CRLF = CHAR(10); DECLARE @SQL VARCHAR(2000); \n",[30,493,494],{"class":32,"line":167},[30,495,496],{},"SET @SQL = 'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[' + @SCHEMA + '].[' + @TableName + '_Audit]'') AND type in (N''U'')) DROP TABLE [' + @SCHEMA + '].[' + @TableName + '_Audit] CREATE TABLE [' + @SCHEMA + '].[' + @TableName + '_Audit] (' + @CRLF; DECLARE @COLUMNID INT; SET @COLUMNID = 0; DECLARE @COLUMNNAME VARCHAR(1000); DECLARE @COLUMNTYPE VARCHAR(100); DECLARE @COLUMNSIZE INT; WHILE @Done = 0 BEGIN SELECT TOP 1 @COLUMNID = clmns.column_id , @COLUMNNAME = clmns.name , @COLUMNTYPE = usrt.name , @COLUMNSIZE = CAST(CASE WHEN baset.name IN ( N'nchar', N'nvarchar' ) AND clmns.max_length &lt;&gt; -1 THEN clmns.max_length \u002F 2 ELSE clmns.max_length END AS INT) FROM sys.tables AS tbl INNER JOIN sys.all_columns AS clmns ON clmns.object_id = tbl.object_id LEFT OUTER JOIN sys.types AS usrt ON usrt.user_type_id = clmns.user_type_id LEFT OUTER JOIN sys.types AS baset ON baset.user_type_id = clmns.system_type_id AND baset.user_type_id = baset.system_type_id WHERE ( tbl.name = @TableName AND SCHEMA_NAME(tbl.schema_id) = @SCHEMA ) AND clmns.column_id &gt; @COLUMNID ORDER BY clmns.column_id ASC; IF @@rowcount = 0 BEGIN SET @Done = 1; END; ELSE BEGIN SET @SQL = @SQL + ' [' + @COLUMNNAME + '] [' + @COLUMNTYPE + '] '; IF ( @COLUMNTYPE = 'nchar' OR @COLUMNTYPE = 'nvarchar' OR @COLUMNTYPE = 'varchar' ) SET @SQL = @SQL + '(' + LTRIM(STR(@COLUMNSIZE)) + ') '; \n",[30,498,499],{"class":32,"line":173},[30,500,501],{},"SET @SQL = @SQL + 'NULL, ' + @CRLF; END; END; SET @SQL = @SQL + ' [' + @TableName + 'UpdateDate] datetime, [' + @TableName + 'UpdateAction] nvarchar(10) ) '; --print @SQL EXEC (@SQL);\n",[30,503,504],{"class":32,"line":178},[30,505,506],{},"SET @SQL = ' IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''[' + @SCHEMA + '].[' + @TableName + '_Trigger_Update]'')) DROP TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Update] IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''[' + @SCHEMA + '].[' + @TableName + '_Trigger_Delete]'')) DROP TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Delete] IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''[' + @SCHEMA + '].[' + @TableName + '_Trigger_Insert]'')) DROP TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Insert] '; --print @SQL EXEC(@SQL); SET @SQL = 'CREATE TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Update] ON [' + @SCHEMA + '].[' + @TableName + '] AFTER UPDATE AS BEGIN SET NOCOUNT ON; INSERT INTO ' + @TableName + '_Audit SELECT *,getdate(),''Update'' FROM inserted END '; EXEC (@SQL); --print @SQL SET @SQL = 'CREATE TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Delete] ON [' + @SCHEMA + '].[' + @TableName + '] AFTER DELETE AS BEGIN SET NOCOUNT ON; INSERT INTO ' + @TableName + '_Audit SELECT *,getdate(),''Delete'' FROM deleted END ';\n",[30,508,509],{"class":32,"line":184},[30,510,511],{"emptyLinePlaceholder":351},"\n",[30,513,514],{"class":32,"line":190},[30,515,516],{},"EXEC (@SQL); --print @SQL SET @SQL = 'CREATE TRIGGER [' + @SCHEMA + '].[' + @TableName + '_Trigger_Insert] ON [' + @SCHEMA + '].[' + @TableName + '] AFTER INSERT AS BEGIN SET NOCOUNT ON; INSERT INTO ' + @TableName + '_Audit SELECT *,getdate(),''Insert'' FROM inserted END '; EXEC (@SQL);\n",[30,518,519],{"class":32,"line":196},[30,520,521],{},"--print @SQL\n",[341,523,343],{},{"title":25,"searchDepth":39,"depth":39,"links":525},[],"2016-02-13T07:03:23.3300000-05:00"," \nThe following script will evaluate the table specified @TableName (you provide below), create a new table with {name}_Audit and also create insert, update and delete triggers.  In my example my table was Dave_Test in scheme engis.",{},"\u002Farticles\u002Fgenerate-insert-update-delete-trigger-for-table-audit",{"title":388,"description":527},"articles\u002Fgenerate-insert-update-delete-trigger-for-table-audit",[24],"Dt6NMP0mx0GNm-szVZbRfyE2hv-az2OeYHLGEoaDFqU",{"id":535,"title":536,"author":7,"body":537,"createdAt":671,"description":672,"extension":348,"img":549,"meta":673,"navigation":351,"path":674,"seo":675,"stem":676,"tags":677,"updatedAt":671,"__hash__":679},"articles\u002Farticles\u002Fxamarin-android-use-toolbar-in-place-of-actionbar.md","Xamarin Android - Use Toolbar in place of ActionBar",{"type":9,"value":538,"toc":669},[539,554,560,576,581,584,603,610,615,642,653,656,660],[12,540,541,542,544,551,553],{},"Add references to Xamarin.Android.Support.v7.AppCompat (this will also include Xamarin.Android.Support.v4)",[16,543],{},[334,545,547],{"href":546},"\u002Farticles\u002Fimages\u002Fwindows-live-writer-xamarin-android-use-toolbar-in-place-o_b87d-image_2.png",[406,548],{"style":408,"src":549,"border":410,"alt":411,"title":411,"width":425,"height":550},"\u002Farticles\u002Fimages\u002Fwindows-live-writer-xamarin-android-use-toolbar-in-place-o_b87d-image_thumb.png",209,[16,552],{},"\nOpen Main.axml adding the following toolbar element",[20,555,559],{"className":556},[557,558],"brush:","xml;","\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>  \n\u003Candroid.support.v7.widget.Toolbar xmlns:android=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres\u002Fandroid\"  \n    xmlns:app=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres-auto\"  \n    android:id=\"@+id\u002Ftoolbar\"  \n    android:layout_height=\"wrap_content\"  \n    android:minHeight=\"?attr\u002FactionBarSize\"  \n    android:background=\"?attr\u002FcolorPrimary\"  \n    android:layout_width=\"match_parent\" \u002F>",[12,561,562,563,565,573,575],{},"Opening in the designer we have",[16,564],{},[334,566,568],{"href":567},"\u002Farticles\u002Fimages\u002Fwindows-live-writer-xamarin-android-use-toolbar-in-place-o_b87d-image_4.png",[406,569],{"style":408,"src":570,"border":410,"alt":411,"title":411,"width":571,"height":572},"\u002Farticles\u002Fimages\u002Fwindows-live-writer-xamarin-android-use-toolbar-in-place-o_b87d-image_thumb_1.png",296,117,[16,574],{},"\nUpdating MainActivity.cs",[20,577,580],{"className":578},[557,579],"csharp;","using System;  \nusing Android.App;  \nusing Android.Content;  \nusing Android.Runtime;  \nusing Android.Views;  \nusing Android.Widget;  \nusing Android.OS;  \nusing SupportToolbar = Android.Support.V7.Widget.Toolbar;  \nusing Android.Support.V7.App;  \nusing Android.Support.V4.Widget;  \nusing System.Collections.Generic;  \n  \nnamespace AppDave  \n{      \n    [Activity(Label = \"AppDave\", MainLauncher = true, Icon = \"@drawable\u002Ficon\", Theme=\"@style\u002FMyTheme\")]  \n    public class MainActivity : ActionBarActivity  \n    {  \n        private SupportToolbar _toolbar;  \n  \n        protected override void OnCreate(Bundle bundle)  \n        {  \n            base.OnCreate(bundle);                      \n            SetContentView(Resource.Layout.Main);  \n  \n            _toolbar = FindViewById\u003CSupportToolbar>(Resource.Id.toolbar);  \n            \u002F\u002Fsets the actionbar to our toolbar  \n            SetSupportActionBar(_toolbar);    \n            \u002F\u002Fwe can now call our toolbar via SupportActionBar  \n            SupportActionBar.Title = \"MyToolbar\";  \n        }  \n  \n        public override bool OnCreateOptionsMenu(IMenu menu)  \n        {              \n            MenuInflater.Inflate(Resource.Menu.action_menu, menu);  \n            return base.OnCreateOptionsMenu(menu);  \n        }  \n    }  \n}",[12,582,583],{},"Notes:",[585,586,587,591,594,597,600],"ul",{},[588,589,590],"li",{},"I am deriving from ActionBarActivity instead of Activity (see above)",[588,592,593],{},"I am using a styles.xml. This will be used to specify the theme that will be applied to the activity.  The theme will inherit from the AppCompat.Light theme. Then at this point we can override the default values for that theme.",[588,595,596],{},"Note: instead of specifying .NoActionBar as shown below I have read that you can also specify the parent as Theme.AppCompat.Light then the first attribute would be \u003Citem name=”windowActionBar”>false\u003C\u002Fitem>  I found however by specifying no action bar in this manner I had the following exception “Java.Lang.IllegalArgumentException: AppCompat does not support the current theme features”.  As a result I did have to use the .NoActionBar option as shown in the xml snippet.",[588,598,599],{},"SetSupportActionBar will be used to actually set the action bar to our toolbar.  At this point, SupportActionBar will be used to call the toolbar.",[588,601,602],{},"In order to get the action menu to be inflated on the toolbar use public override OnCreateOptionsMenu",[604,605,154,606,154],"blockquote",{},[20,607,609],{"className":608},[557,558],"\u003C?xml version=\"1.0\" encoding=\"utf-8\" ?>  \n\u003Cresources>    \n  \u003Cstyle name=\"MyTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">   \n    \u003Citem name=\"colorPrimary\">#2196F3\u003C\u002Fitem>  \n  \u003C\u002Fstyle>  \n\u003C\u002Fresources>  \n",[585,611,612],{},[588,613,614],{},"The menu within the toolbar is also specified via action_menu.xml.  This will be the quick menu on the top right.",[604,616,154,617],{},[20,618,620,621],{"className":619},[557,558],"\u003C?xml version=\"1.0\" encoding=\"UTF-8\" ?>  \n\u003Cmenu  \n    xmlns:android=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres\u002Fandroid\"  \n    xmlns:app=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres-auto\">  \n",[12,622,623,624,626,627,629,630,632,633,635,636,638,639,641],{},"\u003Citem android:id=\"@+id\u002Faction_help\"",[16,625],{},"\nandroid:icon=\"@drawable\u002Fic_action_help\"",[16,628],{},"\nandroid:title=\"Help\"\u002F>",[16,631],{},"\n\u003Citem android:id=\"@+id\u002Faction_refresh\"",[16,634],{},"\nandroid:icon=\"@drawable\u002Fic_action_refresh\"",[16,637],{},"\nandroid:title=\"Refresh\"\u002F>",[16,640],{},"\n\u003C\u002Fmenu>",[12,643,644],{},[334,645,647],{"href":646},"\u002Farticles\u002Fimages\u002Fwindows-live-writer-xamarin-android-use-toolbar-in-place-o_b87d-image_6.png",[406,648],{"style":649,"src":650,"border":410,"alt":411,"title":411,"width":651,"height":652},"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;","\u002Farticles\u002Fimages\u002Fwindows-live-writer-xamarin-android-use-toolbar-in-place-o_b87d-image_thumb_2.png",199,318,[12,654,655],{},"Note: in the above action menu we did not override the app : showAsAction element.  If I specify showAsAction in the following manner you can see the differences.  When specifying as never the icon is visible to the left of the …",[20,657,659],{"className":658},[557,558],"\u003C?xml version=\"1.0\" encoding=\"UTF-8\" ?>  \n\u003Cmenu  \n    xmlns:android=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres\u002Fandroid\"  \n    xmlns:app=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres-auto\">  \n  \n  \u003Citem android:id=\"@+id\u002Faction_help\"  \n        android:icon=\"@drawable\u002Fic_action_help\"  \n        android:title=\"Help\"  \n        app:showAsAction=\"always\"  \n        \u002F>  \n  \n  \u003Citem android:id=\"@+id\u002Faction_refresh\"  \n        android:icon=\"@drawable\u002Fic_action_refresh\"  \n        android:title=\"Refresh\"  \n        app:showAsAction=\"never\"  \n        \u002F>  \n\u003C\u002Fmenu>  \n",[12,661,662],{},[334,663,665],{"href":664},"\u002Farticles\u002Fimages\u002Fwindows-live-writer-xamarin-android-use-toolbar-in-place-o_b87d-image_8.png",[406,666],{"style":649,"src":667,"border":410,"alt":411,"title":411,"width":425,"height":668},"\u002Farticles\u002Fimages\u002Fwindows-live-writer-xamarin-android-use-toolbar-in-place-o_b87d-image_thumb_3.png",77,{"title":25,"searchDepth":39,"depth":39,"links":670},[],"2016-02-07T09:50:32.1900000-05:00","A toolbar in place of an actionbar with a menu, the end result.",{},"\u002Farticles\u002Fxamarin-android-use-toolbar-in-place-of-actionbar",{"title":536,"description":672},"articles\u002Fxamarin-android-use-toolbar-in-place-of-actionbar",[678],"xamarin","3MdES8JhgEfxYHKgSOClj6WwiA-BKs6xZS5LaqZ_HSc",1781574767548]