MS SQL Server 表資料更新時間查詢

2021-06-14 06:36:58 字數 4330 閱讀 3662

檢查資料庫表最近一次被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 將自動除去臨時表。臨時表不儲存在當前資料庫內,而是儲存在系統資料...