1
/****** Special procedure to create auditing ******/
2
DECLARE @table_name nvarchar(250)
3
DECLARE @column_name nvarchar(250)
4
DECLARE @ddl nvarchar(20)
6
DECLARE @sql nvarchar(4000)
7
DECLARE @columns nvarchar(4000)
8
DECLARE @column_list nvarchar(4000)
9
DECLARE @trigger_columns nvarchar(4000)
11
DECLARE curTables CURSOR FOR
13
FROM information_schema.tables
14
WHERE table_type = 'BASE TABLE' AND
15
OBJECTPROPERTY (OBJECT_ID(table_name), 'IsMsShipped') = 0 AND
16
table_name NOT LIKE '%Audit%'
19
FETCH NEXT FROM curTables INTO @table_name
20
WHILE @@FETCH_STATUS = 0
23
DECLARE curColumns CURSOR FOR
24
SELECT column_name, COLUMNPROPERTY(OBJECT_ID(QUOTENAME(table_schema) + '.' + QUOTENAME(table_name)), column_name, 'IsIdentity') AS isidentity
25
FROM information_schema.columns
26
WHERE OBJECTPROPERTY(OBJECT_ID(QUOTENAME(table_schema) + '.' + QUOTENAME(table_name)), 'IsMSShipped') = 0
27
AND data_type NOT IN ('text','ntext','image')
28
AND TABLE_NAME = @table_name
29
ORDER BY ordinal_position
31
SET @columns = CHAR(39) + 'X' + CHAR(39) + ' AS AuditID,'+ CHAR(39) + 'I' + CHAR(39) + ' AS AuditCode'
32
SET @column_list = 'AuditCode'
33
SET @trigger_columns = ''
35
FETCH NEXT FROM curColumns INTO @column_name, @identity
36
WHILE @@FETCH_STATUS = 0
38
SET @columns = @columns + ','
39
SET @trigger_columns = @trigger_columns + 't.' + @column_name + ','
40
SET @columns = @columns + CASE @identity WHEN 1 THEN 'CAST('+@column_name+' AS int) AS ' + @column_name ELSE @column_name END
41
SET @column_list = @column_list + ','+@column_name
42
FETCH NEXT FROM curColumns INTO @column_name, @identity
46
SET @columns = @columns + ',getdate() AS AuditOn,SYSTEM_USER AS AuditUserName'
47
SET @column_list = @column_list + ',AuditOn,AuditUserName'
49
IF NOT EXISTS (SELECT * FROM information_schema.tables WHERE table_name = ' + CHAR(39) + @table_name + 'Audit' + CHAR(39) + ')
51
SELECT ' + @columns + ' INTO dbo.' + @table_name + 'Audit FROM ' + @table_name + ' WHERE 1=2
52
ALTER TABLE dbo.' + @table_name + 'Audit ALTER COLUMN
53
AuditID uniqueidentifier NOT NULL
54
ALTER TABLE dbo.' + @table_name + 'Audit ADD CONSTRAINT '+@table_name+'_Sid
55
DEFAULT NEWSEQUENTIALID() FOR AuditID
56
ALTER TABLE dbo.' + @table_name + 'Audit ALTER COLUMN
57
AuditCode char(1) NOT NULL
58
ALTER TABLE dbo.' + @table_name + 'Audit ALTER COLUMN
59
AuditOn datetime NOT NULL
60
ALTER TABLE dbo.' + @table_name + 'Audit ALTER COLUMN
61
AuditUserName nvarchar(255) NOT NULL
63
ALTER TABLE dbo.' + @table_name + 'Audit ADD
64
CONSTRAINT Pk_' + @table_name + 'Audit PRIMARY KEY CLUSTERED
73
IF EXISTS ( SELECT * FROM sysobjects so WHERE OBJECTPROPERTY(so.id, 'IsTrigger')=1 AND OBJECTPROPERTY(so.id, 'IsMSShipped')=0 AND so.name = 'Audit' + @table_name)
79
TRIGGER dbo.Audit' + @table_name + ' ON dbo.' + @table_name + '
80
FOR INSERT, UPDATE, DELETE
85
IF EXISTS(SELECT * FROM INSERTED)
87
IF EXISTS(SELECT * FROM DELETED)
88
INSERT INTO dbo.' + @table_name + 'Audit
89
(' + @column_list + ')
91
' + CHAR(39) + 'U' + CHAR(39) + ' AS AuditCode,
92
' + @trigger_columns + '
94
(SELECT CASE context_info WHEN 0x00 THEN SYSTEM_USER ELSE CAST(context_info AS nvarchar) END FROM master..sysprocesses WHERE spid=@@spid) AS AuditUserName
97
INSERT INTO dbo.' + @table_name + 'Audit
98
(' + @column_list + ')
100
' + CHAR(39) + 'I' + CHAR(39) + ' AS AuditCode,
101
' + @trigger_columns + '
102
GETDATE() AS AuditOn,
103
(SELECT CASE context_info WHEN 0x00 THEN SYSTEM_USER ELSE CAST(context_info AS nvarchar) END FROM master..sysprocesses WHERE spid=@@spid) AS AuditUserName
107
INSERT INTO dbo.' + @table_name + 'Audit
108
(' + @column_list + ')
110
' + CHAR(39) + 'D' + CHAR(39) + ' AS AuditCode,
111
' + @trigger_columns + '
112
GETDATE() AS AuditOn,
113
(SELECT CASE context_info WHEN 0x00 THEN SYSTEM_USER ELSE CAST(context_info AS nvarchar) END FROM master..sysprocesses WHERE spid=@@spid) AS AuditUserName
119
FETCH NEXT FROM curTables INTO @table_name