239 lines
7.8 KiB
MySQL
239 lines
7.8 KiB
MySQL
/****** Object: StoredProcedure [dbo].[jcbAuditConfig] Script Date: 03/29/2011 17:32:35 ******/
|
|
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[jcbAuditConfig]') AND type in (N'P', N'PC'))
|
|
DROP PROCEDURE [dbo].[jcbAuditConfig]
|
|
GO
|
|
|
|
/****** Object: StoredProcedure [dbo].[jcbAuditConfig] Script Date: 03/29/2011 17:33:30 ******/
|
|
SET ANSI_NULLS ON
|
|
GO
|
|
SET QUOTED_IDENTIFIER ON
|
|
GO
|
|
|
|
create procedure [dbo].[jcbAuditConfig]
|
|
@tablename varchar(max)
|
|
as begin
|
|
--print 'table name: ' + @tablename
|
|
declare @cmd varchar(max)
|
|
set @cmd = ''
|
|
|
|
--new table name variable
|
|
declare @newtablename varchar(max)
|
|
set @newtablename = 'tbl' + @tablename
|
|
--print 'new table name: ' + @newtablename
|
|
|
|
--rename table
|
|
set @cmd = 'sp_rename ' + '''' + @tablename + '''' + ',' + '''' + @newtablename + ''''
|
|
--print 'rename table: ' + @cmd
|
|
exec (@cmd)
|
|
set @cmd = ''
|
|
|
|
--add column DeleteStatus
|
|
set @cmd = 'alter table ' + @newtablename + ' add DeleteStatus int not null constraint DF_' + @newtablename + '_DeleteStatus default ((0))'
|
|
--print 'add column deletestatus: ' + @cmd
|
|
exec (@cmd)
|
|
set @cmd = ''
|
|
|
|
--create index on deletestatus
|
|
set @cmd = 'CREATE NONCLUSTERED INDEX IX_' + @newtablename + 'DeleteStatus ON ' + @newtablename + '
|
|
(
|
|
[DeleteStatus] ASC
|
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
|
|
'
|
|
exec (@cmd)
|
|
set @cmd = ''
|
|
|
|
--primary key variable
|
|
declare @primarykey varchar(max)
|
|
select @primarykey = coalesce(@primarykey + ' and ','') +
|
|
'dd.' + c.name + ' = ' + 'ii.' + c.name
|
|
from sysindexes i
|
|
inner join sysobjects o ON i.id = o.id
|
|
inner join sysobjects pk ON i.name = pk.name and pk.parent_obj = i.id and pk.xtype = 'PK'
|
|
inner join sysindexkeys ik on i.id = ik.id and i.indid = ik.indid
|
|
inner join syscolumns c ON ik.id = c.id and ik.colid = c.colid
|
|
where o.name = @newtablename
|
|
order by ik.keyno
|
|
--print 'primary key: ' + @primarykey
|
|
|
|
--shadow table name variable
|
|
declare @shadowtablename varchar(max)
|
|
if substring(@tablename,len(@tablename)-2,3) = 'ies'
|
|
set @shadowtablename = replace(@tablename,'ies','y') + 'Audits'
|
|
else
|
|
set @shadowtablename = substring(@tablename,1,len(@tablename)-1) + 'Audits'
|
|
--print 'shadow table name: ' + @shadowtablename
|
|
|
|
--create base shadow table
|
|
set @cmd = 'create table ' + @shadowtablename + '(AuditID bigint identity (1,1) not null CONSTRAINT [PK_' + @shadowtablename + '] PRIMARY KEY CLUSTERED ([AuditID] ASC))'
|
|
--print 'create shadow table: ' + @cmd
|
|
exec (@cmd)
|
|
set @cmd = ''
|
|
|
|
--temp variables for cursor
|
|
declare @columnname varchar(max)
|
|
declare @columntype varchar(max)
|
|
declare @columnlength smallint
|
|
declare @columnnullable int
|
|
declare @columncollation sysname
|
|
declare @columnprecision tinyint
|
|
declare @columnscale tinyint
|
|
|
|
--separator variable
|
|
declare @sep varchar(max)
|
|
set @sep = ''
|
|
|
|
--table columns variable
|
|
declare @tablecolumns varchar(max)
|
|
set @tablecolumns = ''
|
|
|
|
--ii table columns variable
|
|
declare @iitablecolumns varchar(max)
|
|
set @iitablecolumns = ''
|
|
|
|
--dd table columns variable
|
|
declare @ddtablecolumns varchar(max)
|
|
set @ddtablecolumns = ''
|
|
|
|
--view columns variable
|
|
declare @viewcolumns varchar(max)
|
|
set @viewcolumns = ''
|
|
|
|
--trigger columns variable
|
|
declare @trigcolumns varchar(max)
|
|
set @trigcolumns = ''
|
|
|
|
--cursor for getting columns
|
|
declare tc cursor read_only for
|
|
select c.name,t.name typename,c.length,c.isnullable,c.collation,c.xprec,c.xscale
|
|
from sysobjects o
|
|
inner join syscolumns c on o.id = c.id
|
|
inner join systypes t on c.xtype = t.xtype
|
|
where 1=1
|
|
and o.name = @newtablename
|
|
and t.name != 'sysname'
|
|
order by c.colorder
|
|
|
|
--alter shadow table command
|
|
set @cmd = 'alter table ' + @shadowtablename + ' add '
|
|
--print 'alter shadow table start: ' + @cmd
|
|
|
|
open tc
|
|
fetch next from tc
|
|
into @columnname,@columntype,@columnlength,@columnnullable,@columncollation,@columnprecision,@columnscale
|
|
while @@fetch_status = 0
|
|
begin
|
|
if @columntype not in ('text','ntext','image')
|
|
begin
|
|
if @columntype not in ('timestamp')
|
|
begin
|
|
set @cmd = @cmd + @sep + @columnname + ' ' + @columntype
|
|
if @columntype in ('binary','char','nchar','nvarchar','varbinary','varchar')
|
|
begin
|
|
if @columnlength = -1
|
|
set @cmd = @cmd + '(max)'
|
|
else
|
|
set @cmd = @cmd + '(' + cast(@columnlength as varchar(10)) + ')'
|
|
end
|
|
if @columntype in ('decimal','numeric')
|
|
set @cmd = @cmd + '(' + cast(@columnprecision as varchar(10)) + ',' + cast(@columnscale as varchar(10)) + ')'
|
|
if @columntype in ('char','nchar','nvarchar','varchar')
|
|
set @cmd = @cmd + ' collate ' + @columncollation + ' '
|
|
if @columnnullable = 0
|
|
set @cmd = @cmd + ' not'
|
|
set @cmd = @cmd + ' null'
|
|
set @tablecolumns = @tablecolumns + @sep + @columnname
|
|
set @iitablecolumns = @iitablecolumns + @sep + 'ii.' + @columnname
|
|
set @ddtablecolumns = @ddtablecolumns + @sep + 'dd.' + @columnname
|
|
end
|
|
if @columnname <> 'DeleteStatus'
|
|
begin
|
|
set @viewcolumns = @viewcolumns + @sep + @columnname
|
|
if @columntype not in ('timestamp')
|
|
begin
|
|
set @trigcolumns = @trigcolumns + @sep + @columnname
|
|
end
|
|
end
|
|
set @sep = ','
|
|
end
|
|
fetch next from tc
|
|
into @columnname,@columntype,@columnlength,@columnnullable,@columncollation,@columnprecision,@columnscale
|
|
end
|
|
close tc
|
|
deallocate tc
|
|
|
|
--modify shadow table
|
|
--print 'modify shadow table: ' + @cmd
|
|
exec (@cmd)
|
|
set @cmd = ''
|
|
|
|
--add extended property for shadow table dts
|
|
set @cmd = 'sys.sp_addextendedproperty @name=N''MS_Description'', @value=N''{datetime}'' , @level0type=N''SCHEMA'',@level0name=N''dbo'', @level1type=N''TABLE'',@level1name=N''' + @shadowtablename + ''', @level2type=N''COLUMN'',@level2name=N''DTS'''
|
|
exec (@cmd)
|
|
set @cmd = ''
|
|
|
|
--add original indexes to shadowtable
|
|
--variables for cursor
|
|
declare @indexcolumnname varchar(max)
|
|
declare ic cursor for
|
|
select
|
|
c.name columnname
|
|
from sysindexes i
|
|
inner join sysobjects o ON i.id = o.id
|
|
inner join sysindexkeys ik on i.id = ik.id and i.indid = ik.indid
|
|
inner join syscolumns c ON ik.id = c.id and ik.colid = c.colid
|
|
where o.name = @newtablename
|
|
|
|
open ic
|
|
fetch next from ic into @indexcolumnname
|
|
while @@fetch_status = 0
|
|
begin
|
|
set @cmd = 'CREATE NONCLUSTERED INDEX IX_' + @shadowtablename + @indexcolumnname + ' on ' + @shadowtablename + '
|
|
(' + @indexcolumnname + ')
|
|
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]'
|
|
exec (@cmd)
|
|
set @cmd = ''
|
|
end
|
|
close ic
|
|
deallocate ic
|
|
|
|
--create view
|
|
set @cmd = 'create view ' + @tablename + ' as select ' + @viewcolumns + ' from ' + @newtablename + ' where DeleteStatus = 0'
|
|
--print 'create view: ' + @cmd
|
|
exec (@cmd)
|
|
set @cmd = ''
|
|
|
|
--create update trigger on table
|
|
set @cmd = 'create trigger tr_' + @newtablename + '_Update on ' + @newtablename +
|
|
' for update as
|
|
begin
|
|
if exists (select * from inserted)
|
|
begin
|
|
insert into ' + @shadowtablename + '(' + @tablecolumns + ')
|
|
select ' + @ddtablecolumns + ' from deleted dd
|
|
inner join inserted ii on ' + @primarykey + '
|
|
end
|
|
end'
|
|
--print 'table trigger update: ' + @cmd
|
|
exec (@cmd)
|
|
set @cmd = ''
|
|
|
|
--create delete trigger on view
|
|
set @cmd = 'create trigger tr_' + @tablename + '_Delete on ' + @tablename +
|
|
' instead of delete as
|
|
begin
|
|
update ii set DeleteStatus = (select max(DeleteID) from DeleteLog where SPID = @@spid), DTS = getdate(),
|
|
UserID = (select top 1 UserID from DeleteLog where SPID = @@spid order by deleteid desc)
|
|
from ' + @newtablename + ' ii inner join deleted dd on ' + @primarykey + '
|
|
insert into ' + @shadowtablename + '(' + @tablecolumns + ')
|
|
select ' + @iitablecolumns + '
|
|
from ' + @newtablename + ' ii inner join deleted dd on ' + @primarykey + '
|
|
where ii.DeleteStatus > 0
|
|
end'
|
|
--print 'view trigger delete: ' + @cmd
|
|
exec (@cmd)
|
|
set @cmd = ''
|
|
end
|
|
|
|
|
|
|