監測資料庫的結構變化

2022-03-12 01:57:01 字數 4027 閱讀 1103

有時候,乙個專案裡有很多人都有許可權修改資料庫的結構,就會造成,乙個人更改了表結構,而其他開發者不知道的情況。為了記錄那些人對哪些結構進行了修改。下面有一段指令碼可以記錄修改活動。

首先 建立乙個表,用來記錄 修改的活動。

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 @[email protected]('(/event_instance/databasename)[1]','varchar(100)')

set @[email protected]('(/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 @[email protected]('(/event_instance/posttime)[1]','datetime')

set @[email protected]('(/event_instance/servername)[1]','varchar(100)')  

set @[email protected]('(/event_instance/loginname)[1]','varchar(100)')

set @[email protected]('(/event_instance/eventtype)[1]','varchar(100)')

set @[email protected]('(/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追蹤資料庫死鎖 ...