有時候,乙個專案裡有很多人都有許可權修改資料庫的結構,就會造成,乙個人更改了表結構,而其他開發者不知道的情況。為了記錄那些人對哪些結構進行了修改。下面有一段指令碼可以記錄修改活動。
首先 建立乙個表,用來記錄 修改的活動。
set ansi_nulls on
goset quoted_identifier on
goset ansi_padding on
gocreate table [dbo].[ddl_log](
[log_id] [int] identity(1,1) not null,
[post_time] [datetime] null,
[server_name] [varchar](100) null,
[database_name] [varchar](100) null,
[login_name] [varchar](100) null,
[target_object_name] [varchar](100) null,
[event_type] [varchar](100) null,
[command_text] [varchar](8000) null,
[client_host_name] [varchar](128) null,
[client_ip] [varchar](20) null,
[client_mac] [varchar](20) null,
[client_program_name] [nvarchar](128) null,
[event_instance] [xml] null,
primary key clustered
([log_id] asc
)with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) on [primary]
) on [primary]
goset ansi_padding off
go接著 寫乙個觸發器,將對資料庫結構的修改行為記錄緊 上面的表中。
set ansi_nulls on
goset quoted_identifier on
gocreate trigger [ddl_trigger_database]
on database
for ddl_database_level_events
asdeclare @data xml,
@post_time datetime, --建立時間
@server_name varchar(100), --伺服器名
@databasename varchar(100), --資料庫名稱
@login_name varchar(100), --登入使用者名稱
@target_object_name varchar(100), --觸發物件名稱
@event_type varchar(100), --事件型別
@command_text varchar(8000), --執行**
@client_host_name varchar(128), --工作站名稱
@client_ip varchar(20), --客戶端ip位址
@client_mac varchar(20), --客戶端mac位址
@client_program_name nvarchar(128) --客戶端應用程式
set @data=eventdata()
--path 區分大小寫
set @databasename=@data.value('(/event_instance/databasename)[1]','varchar(100)')
set @target_object_name=@data.value('(/event_instance/objectname)[1]','varchar(100)')
if lower(@target_object_name)='ddl_log' and @data.value('(/event_instance/objecttype)[1]','varchar(100)')='table'
begin
raiserror('deleted or alter table ddl_log fail.', 16, -1)
rollback transaction
return
end
set @post_time=@data.value('(/event_instance/posttime)[1]','datetime')
set @server_name=@data.value('(/event_instance/servername)[1]','varchar(100)')
set @login_name=@data.value('(/event_instance/loginname)[1]','varchar(100)')
set @event_type=@data.value('(/event_instance/eventtype)[1]','varchar(100)')
set @command_text=@data.value('(/event_instance/tsqlcommand/commandtext)[1]','varchar(8000)')
set @command_text=ltrim(rtrim(replace(replace(@command_text,char(10),' '),char(13),' '))) --換行替換為空格
select @client_ip = client_net_address from sys.dm_exec_connections where session_id = @@spid
select @client_program_name = program_name,@client_host_name=host_name from sys.dm_exec_sessions where session_id = @@spid
select @client_mac = net_address from master.dbo.sysprocesses where spid = @@spid
insert into [ddl_log]
([post_time]
,[server_name]
,[database_name]
,[login_name]
,[target_object_name]
,[event_type]
,[command_text]
,[client_host_name]
,[client_ip]
,[client_mac]
,[client_program_name]
,[event_instance])
values
(@post_time
,@server_name
,@databasename
,@login_name
,@target_object_name
,@event_type
,@command_text
,@client_host_name
,@client_ip
,@client_mac
,@client_program_name
,@data)
goset ansi_nulls off
goset quoted_identifier off
godisable trigger [ddl_trigger_database] on database
goenable trigger [ddl_trigger_database] on database
go這樣通過查詢 第一步中的表,就可檢視,哪些使用者對資料庫執行了哪些操作了。
哈哈。
SqlDependency監測資料庫變化
今天做專案,要監測資料庫某張表發生變化,在網上找了下方法,發現c 中sqldependency可以採用非輪訓的方式來監測資料庫是否發生改動,基本的 如下 void iregister.register private void updategrid name sdr id sdr name sdr....
如何監測名片夾資料庫的變化?
如何監測名片夾資料庫的變化?tss000032 開發夥伴平台 60系列開發平台 1.0 2.0 裝置,軟體版本 無 大類 symbian c 子類 普通 說明 下面提供一段 示例如何監測名片夾的變化 code ceventscontacts implements mcontactdbobserver...
資料庫監測sql執行
sql server profiler可以檢測在資料上執行的語句,特別是有的專案不直接使用sql語句,直接使用orm框架的系統處理資料庫的專案,在除錯sql語句時,給了很大的幫助。之前寫了使用sql server profiler追蹤死鎖的文章 sql server profiler追蹤資料庫死鎖 ...