XEVENT:记录对表的更新删除

--以下xevent记录了通过sqlserver查询工具直接更新,删除表数据时的记录。
IF NOT EXISTS( SELECT 1 FROM sys.dm_xe_sessions dxs(NOLOCK) WHERE name = ‘EventErrorMonitor‘ )
BEGIN
	CREATE EVENT session EventErrorMonitor on server
	ADD EVENT sqlserver.error_reported
	(
	ACTION
	(
	sqlserver.session_id, -- SPID which raises the error
	sqlserver.plan_handle, -- Plan handle which can be used to retrieve the graphical plan
	sqlserver.tsql_stack, -- T-SQL stack for extended debugging purposes
	package0.callstack, -- Callstack for extended debugging purposes
	sqlserver.sql_text, -- T-SQL query which encountered the error
	sqlserver.username, -- Name of the user that reported the error
	sqlserver.client_app_name, -- Client application name
	sqlserver.client_hostname, -- Host which initiated the query
	sqlserver.database_name -- Database against which the query was being executed
	)
	 WHERE severity >= 11 AND Severity <=16
	)
	ADD TARGET package0.ring_buffer
	WITH (max_dispatch_latency=1seconds)

	ALTER EVENT SESSION EventErrorMonitor on server state = START

END
ELSE
BEGIN

	SELECT
		 DATEADD(hh,
				DATEDIFF(hh, GETUTCDATE(), CURRENT_TIMESTAMP),
				n.value(‘(event/@timestamp)[1]‘, ‘datetime2‘)) AS [timestamp],
		n.value(‘(event/action[@name="database_name"]/value)[1]‘, ‘nvarchar(128)‘) AS [database_name],
		n.value(‘(event/action[@name="sql_text"]/value)[1]‘, ‘nvarchar(max)‘) AS [sql_text],
		n.value(‘(event/data[@name="message"]/value)[1]‘, ‘nvarchar(max)‘) AS [message],
		n.value(‘(event/action[@name="username"]/value)[1]‘, ‘nvarchar(max)‘) AS [username],
		n.value(‘(event/action[@name="client_hostname"]/value)[1]‘, ‘nvarchar(max)‘) AS [client_hostname],
		n.value(‘(event/action[@name="client_app_name"]/value)[1]‘, ‘nvarchar(max)‘) AS [client_app_name],
		n.value(‘(event/action[@name="tsql_stack"]/value/frames/frame/@handle)[1]‘, ‘varchar(max)‘) AS [tsql_stack],
		n.value(‘(event/action[@name="tsql_stack"]/value/frames/frame/@offsetStart)[1]‘, ‘int‘) AS [statement_start_offset],
		n.value(‘(event/action[@name="tsql_stack"]/value/frames/frame/@offsetEnd)[1]‘, ‘int‘) AS [statement_end_offset]
	into #ErrorMonitor
	FROM
	(    SELECT td.query(‘.‘) as n
		FROM
		(
			SELECT CAST(target_data AS XML) as target_data
			FROM sys.dm_xe_sessions AS s
			JOIN sys.dm_xe_session_targets AS t
				ON t.event_session_address = s.address
			WHERE s.name = ‘EventErrorMonitor‘
			  --AND t.target_name = ‘ring_buffer‘
		) AS sub
		CROSS APPLY target_data.nodes(‘RingBufferTarget/event‘) AS q(td)
	) as TAB

	INSERT INTO PerfLogicMessage(StartTime,database_name,message,sql_text,alltext,username,client_hostname,client_app_name)
	SELECT TIMESTAMP,database_name,[message],sql_text,‘‘,username,client_hostname,client_app_name
	FROM #ErrorMonitor a
	WHERE a.sql_text != ‘‘ AND client_app_name !=‘Microsoft SQL Server Management Studio - 查询‘

	INSERT INTO PerfLogicMessage(StartTime,database_name,message,sql_text,alltext,username,client_hostname,client_app_name)
	--查看应用执行的
	SELECT  TIMESTAMP,database_name,[message],
	SUBSTRING(qt.text,a.statement_start_offset/2+1,
				(case when a.statement_end_offset = -1
				then DATALENGTH(qt.text)
				else a.statement_end_offset end -a.statement_start_offset)/2 + 1) sql_text,qt.text alltext,
	username,client_hostname,client_app_name
	FROM #ErrorMonitor a
	CROSS APPLY sys.dm_exec_sql_text(CONVERT(VARBINARY(max),a.tsql_stack,1) )  qt
	WHERE a.sql_text IS NULL AND tsql_stack != ‘‘ AND client_app_name = ‘.Net SqlClient Data Provider‘

	DROP TABLE #ErrorMonitor

	--重启以清空
	ALTER EVENT SESSION EventErrorMonitor ON SERVER STATE = STOP
	ALTER EVENT SESSION EventErrorMonitor on server state = START
END
时间: 2024-11-10 22:25:59

XEVENT:记录对表的更新删除的相关文章

以编程的方式使用SQLite数据库 执行CRUD(创建 读取 更新 删除)操作

DBAdapter数据库辅助类 package com.databses; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.s

介绍一个免费的具备数据显示/录入/更新/删除功能的asp.net控件

我不能说它比datagrid更强, 因为datagrid有很多深层次的东西可以发掘,但是我能说它比datagrid更易用,更实用,因为它已经轻松实现如下功能,同时,它是完全免费的,不需要注册,没有任何的功能限制. 1. 通过属性设置数据表的显示 2. 客户端数据排序 3. 各种字段类型的格式化显示 4. 所有数据表轻松实现内置的数据添加.更新.删除功能 5. 提供密码字段的支持并使用32位MD5编码 6. 添加.更新图象字段.链接文件字段时自动上传文件 7. 上传图片时可以自动生成缩略图 8.

DButils工具类可以用来获取数据库连接向数据库插入更新删除对象2

package com.ctl.util; import java.awt.Color; import java.awt.Font; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.*; import java.lang.reflect.*; import java.sql.*; import java.text.SimpleD

MySQL 记录不存在时插入 记录存在则更新的实现方法

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; INSERT 中 ON DUPLICATE KEY UPDATE的使用  如果指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE.例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:mysql> INSERT INTO ta

在生产环境中安全执行更新删除SQL脚本的技巧

今天在生产环境上解决问题,由于广发银行的管理制度是开发公司是不允许确生产环境的,所以我们只能把要更新的语句发给运营中心,由运营中心的投产人员执行,我们则在旁边看着:在他执行的时候发现了一个很有趣的技巧,现在分享出来. 我们知道每一次在生产环境中执行中执行更新删除语句的时候都要格外小心,要做好数据备份,但是即便这样对于一个做了分库分表设计,有十几个G的库来说更新一句SQL后发现忘记写WHERE语句或是语句写错了,恢复备份的成本都是相当高的. 我注意到运营中心的人在拿到我的SQL语句后,把它放到MS

点击添加按钮添加一条记录,点击删除按钮删除本条记录

点击添加按钮添加一条记录,点击删除按钮删除本条记录,并且最多只能添加4条记录 <div class="addfee"> <div><span class="add-btn">添加</div> </div> jquery //添加删除费用,最多可添加4条 $(".add-btn").on("click", function() { var len = $(".

ubuntu更新删除旧内核的shell脚本

ubuntu经常提示要更新内核,更新几次后 /boot目录就满了,再更新就提示目录没空间了,这时候就需要删除不用的老旧内核,之前都是uname, grep, dpkg之类的命令一条条敲,然后用眼睛看需要apt-get --purge remove哪几个版本的内核,后来在网上找到一个小脚本,可以自动完成这些动作,特记录: 1 sudo apt-get remove --purge $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed &quo

mysql外键级联更新删除

MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作,包括RESTRICT.NO ACTION.SET NULL和CASCADE.其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新:CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录:SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被S

MySQL优化之——插入 更新 删除

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46581769 插入 将多行查询结果插入到表中 语法 INSERT INTO table_name1(column_list1) SELECT (column_list2) FROM table_name2 WHERE (condition) table_name1指定待插入数据的表:column_list1指定待插入表中要插入数据的哪些列:table_name2指定插入数据是从