檢查資料庫表最近一次被insert/update/delete的時間來了解各個表的資料寫入情況。這裡通過乙個指令碼給每個表加上觸發器來記錄表資料最後修改時間等資訊。
執行以下t-sql語句,將在當前資料庫中建立乙個日誌表 [dbo].[generic_tbmodify_log] ,並自動從 sysobjects 系統表中獲得資料庫表清單,對除 [dbo].[generic_tbmodify_log] 本身以外的所有使用者表建立觸發器(觸發器名形如 tg_for_genetbmodify_[表名] )。這樣當這些表發生 insert / update / delete 的時候,會自動更新 generic_tbmodify_log 表相應表名的表資料最後更新時間。
-- create table to hold updated message and date
-- tested in ms sql server 2000
if exists (
select * from dbo.sysobjects
where id = object_id(n'[dbo].[generic_tbmodify_log]')
and objectproperty(id, n'isusertable') = 1
) drop
table [dbo].[generic_tbmodify_log]
go
create
table [dbo].[generic_tbmodify_log]
([pkid] [int] identity (1, 1) not
null ,
[tb_name] [varchar] (128)
collate sql_latin1_general_cp1_ci_as null ,
[info] [varchar] (128)
collate sql_latin1_general_cp1_ci_as null ,
[last_modified] [datetime] null ) on [primary]
go
alter
table [dbo].[generic_tbmodify_log] with nocheck
addconstraint [pk_generic_tbmodify_log] primary
keyclustered ([pkid]) on [primary]
go
-- for each table in database generate audit trigger
-- except generic_tbmodify_log, dtproperties
declare @tablename varchar(50)
declare @sqlcmd varchar(2000)
declare tables_cursor cursor
forselect
name
from dbo.sysobjects
where xtype = 'u'
andname
<> 'dtproperties'
andname
<> 'generic_tbmodify_log'
open tables_cursor
fetch
next
from tables_cursor into @tablename
while (@@fetch_status = 0)
begin
-- build create trigger statement
set @sqlcmd = (select
'create trigger [tg_for_genetbmodify_')
set @sqlcmd = @sqlcmd +
@tablename + '] on [dbo].[' + @tablename + ']' +
' for insert, update, delete as' +
' declare @cntinsert integer' +
' declare @cntdelete integer' +
' declare @infostr varchar(128)' +
' select @cntinsert = (select count(*) from inserted)' +
' select @cntdelete = (select count(*) from deleted)' +
' set @infostr='
'''' +
' if @cntinsert > 0 begin' +
' if @cntdelete > 0' +
' set @infostr = @infostr + '
'upd:'
'' +
' else' +
' set @infostr = @infostr + '
'ins:'
'' +
' set @infostr = @infostr + '+
' master.dbo.fn_varbintohexsubstring('+
' 1,columns_updated(),1,0)' +
' end else set @infostr = @infostr + '
'del'
'' +
' if not exists' +
' (select dba.tb_name from' +
' dbo.generic_tbmodify_log dba' +
' where tb_name = '
'' + @tablename + ''
')' +
' begin' +
' insert into generic_tbmodify_log' +
' (tb_name,info,last_modified) values ' +
' ('
'' + @tablename + ''
',' +
' @infostr,' +
' getdate()' +
' )' +
' end' +
' else' +
' begin' +
' update generic_tbmodify_log set' +
' info=@infostr,' +
' last_modified=getdate()' +
' where tb_name='
'' + @tablename + ''
'' +
' end'
-- execute create trigger statement
exec (@sqlcmd) fetch
next
from tables_cursor into @tablename
endclose tables_cursor
deallocate tables_cursor
相應的如果要移除以上指令碼建立的所有trigger,可以執行以下語句:
declare @name
varchar(500)
declare mycursor cursor
forselect
name
from sysobjects
where type = 'tr'
andname
like
'tg_for_genetbmodify_%'
open mycursor
fetch
next
from mycursor into @name
while @@fetch_status = 0
begin
exec ('drop trigger ' + @name)
select
'deleted ' + @name
fetch
next
from mycursor into @name
endclose mycursor
deallocate mycursor
MS SQL Server 幾個系統表介紹
1.表sysobjects用於描述資料庫中的物件 表 檢視 儲存過程等 sysobjects.name 物件名,如 表名,檢視名。sysobjects.id 物件id。sysobjects.type 物件型別 p儲存過程,v檢視,s系統表,u使用者表 ex select from sysobject...
MS SQL SERVER中的臨時表
對於複雜的查詢,我們可以使用巢狀的複雜的sql語句來實現,但是有些時候,借助於臨時表,可以更加方便 高效。sql server 支援臨時表。臨時表就是那些名稱以井號 開頭的表。如果當使用者斷開連線時沒有除去臨時表,sql server 將自動除去臨時表。臨時表不儲存在當前資料庫內,而是儲存在系統資料...
MS SQL SERVER中的臨時表
對於複雜的查詢,我們可以使用巢狀的複雜的sql語句來實現,但是有些時候,借助於臨時表,可以更加方便 高效。sql server 支援臨時表。臨時表就是那些名稱以井號 開頭的表。如果當使用者斷開連線時沒有除去臨時表,sql server 將自動除去臨時表。臨時表不儲存在當前資料庫內,而是儲存在系統資料...