最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

AuditingSQLServerSQLStatements

来源:动视网 责编:小采 时间:2020-11-09 16:29:27
文档

AuditingSQLServerSQLStatements

AuditingSQLServerSQLStatements:谁把我的表给删拉,谁删了整个表阿…碰到这种棘手的情况,你如果没有预先做好准备,真的是头都要急炸了。那怎么能抓出这个凶手呢?SQL Trace, SQL Profile,SQL Trigger,Extended Events等着伺候你呢,更别说CLR,Service Broke
推荐度:
导读AuditingSQLServerSQLStatements:谁把我的表给删拉,谁删了整个表阿…碰到这种棘手的情况,你如果没有预先做好准备,真的是头都要急炸了。那怎么能抓出这个凶手呢?SQL Trace, SQL Profile,SQL Trigger,Extended Events等着伺候你呢,更别说CLR,Service Broke

可以看到go是不能用在动态语句里面的。

为了验证SP:Stmt*是不是指的是存储过程里面的语句,我们先创建一个stored procedure,然后再执行它:

create procedure dbo.getRegionName

as

begin

declare @regionName varchar(20) = 'China'

select top 10 * from dbo.region

where regionName = @regionName

declare @regionNamex varchar(20) = 'England'

select top 10 * from dbo.region

where regionName = @regionNamex

end

exec dbo.getRegionName

这里写图片描述
正是如此 !综上所述, SQL:Batch* , 这里的batch相当于是个scope,一个大的执行空间,里面的所有 SQL 语句都是statement,包括DML,DDL等一系列 T-SQL语句 ;而SP:Stmt*又是存储过程的执行空间,里面所有的 T-SQL语句都是statement。

下面看段c#调用这个stored procedure,看看trace是如何识别的:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data.SqlClient;

using System.Data.SqlTypes;

using System.Data;

namespace AccessLenistest4DB

{

 class Program

 {

 static void Main(string[] args)

 {

 SqlConnection ICONN = new SqlConnection(@"data source = (localhost);initial catalog = lenistest4 ;user id = sa; password = sas;");

 SqlCommand icmd = new SqlCommand();

 icmd.Connection = ICONN;

 icmd.CommandType = System.Data.CommandType.StoredProcedure;

 icmd.CommandText = "dbo.getRegionName";

 SqlDataAdapter ida = new SqlDataAdapter(icmd);

 DataSet localds = new DataSet();

 try

 {

 ICONN.Open();

 ida.Fill(localds);

 }

 catch(SqlException se)

 {

 Console.Write(se.ToString());

 }

 }

 }

}

这里写图片描述
这儿多了个RPC, remote procedure call。其他都一样,所以RPC可以看作是一种命名空间,用阿里区别访问协议。这里要区别的是我们调用的是stored procedure,所以会RPC。所以如果我们是用纯SQL来访问数据库,那会不会有 RPC标示呢:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data.SqlClient;

using System.Data.SqlTypes;

using System.Data;

namespace AccessLenistest4DB

{

 class Program

 {

 static void Main(string[] args)

 {

 SqlConnection ICONN = new SqlConnection(@"data source = (localhost);initial catalog = lenistest4 ;user id = sa; password = sas;");

 SqlCommand icmd = new SqlCommand();

 icmd.Connection = ICONN;

 icmd.CommandType = System.Data.CommandType.Text;

 icmd.CommandText = "select * from dbo.region";

 SqlDataAdapter ida = new SqlDataAdapter(icmd);

 DataSet localds = new DataSet();

 try

 {

 ICONN.Open();

 ida.Fill(localds);

 }

 catch(SqlException se)

 {

 Console.Write(se.ToString());

 }

 }

 }

}

这里写图片描述
并没有RPC。 事实证明 RPC只出现在客户端语言调用存储过程的例子。

Trace的手段 :“破坏分子”的特征被识别了,接下来就是怎么去抓捕的手段问题了。可以有即时的GUI工具,比如SQL Profiler,Extended Event(SSMS自带),也可以用脚本去抓,并放在特定存储里面供稍后分析使用。

SQL Profiler 是即时的GUI工具很好用,可以保存结果,也可以自定义模板,缺点在于你必须开一个额外的窗口去跟踪,有时候数据量太大,还会影响传输,对多太SQL Server做监控就不怎么容易了,一个一个手工去开窗口,是不是很麻烦 ?

这里有Extended Events可以帮我们用脚本的形式去捕捉这些T-SQL语句,这里有个简单的例子:

  1. 通过 Extended Events ,我们可以监控一段时间内的的 SQL Completed 情况,简要介绍下:

1.1 Extended Events 概念:由一系列自动触发的 event 产生性能数据,经过 event engine 的收集,存放到指定的输出文件,以供后续的分析。

1.2 XE 涉及到的动态管理试图 : sys.dm_xe_packages; sys.dm_xe_objects;sys.dm_xe_sessions

1.3 基本用法:

2.3.1 创建一个 Event Session

create event session capture_sql_events

on server

add event sqlserver.sql_statement_completed

(

action(sqlserver.sql_text)

)

add target package0.event_file

(

set filename = 'E:\data_bu\capture_sql_events.xel', metadatafile = 'E:\data_bu\capture_sql_event.xem'

)

go

2.3.2 启用这个 Event session 来收集数据

alter event session capture_sql_events

on server

STATE = start

go

2.3.3 停用这个 Event session

alter event session capture_sql_events

on server

state = stop

go

2.3.4 修改一个 session 来增加或者删除对 Event 的监控

alter event session capture_sql_events on server

add event sqlserver.sql_batch_completed (action(sqlserver.sql_text))

go

2.3.5 查看正在运行的 Event Session

select * from sys.dm_xe_sessions

select * from sys.dm_xe_session_events

2.3.6 查看收集到的统计数据

select top 10 * from dbo.region

go

select * , cast(event_data as xml) as event_data_xml

from sys.fn_xe_file_target_read_file('E:\data_bu\capture_sql_events*.xel',null,null,null)

where event_data like N'%region%'

从结果集我们可以看到,sql_statement_completed这个Event抓到的结果中,包含了Action中我们指定的内容,还包含了其他的一些统计信息:





0





0





0





2





0





6





6





1





0





62





select top 10 * from dbo.region











select top 10 * from dbo.region





我们在Action里面加入对database_name,和plan_handle的捕捉,可以从结果看到又多出来两个元素:

create event session capture_sql_events

on server

add event sqlserver.sql_statement_completed

(

action(sqlserver.sql_text,sqlserver.database_name,sqlserver.plan_handle)

)

add target package0.event_file

(

set filename = 'E:\data_bu\capture_sql_events.xel', metadatafile = 'E:\data_bu\capture_sql_event.xem'

)




0





0





0





2





0





6





6





1





0





62





select top 10 * from dbo.region











06002000448a700f00d62b7a0300000001000000000000000000000000000000000000000000000000000000





lenistest4





select top 10 * from dbo.region





文档

AuditingSQLServerSQLStatements

AuditingSQLServerSQLStatements:谁把我的表给删拉,谁删了整个表阿…碰到这种棘手的情况,你如果没有预先做好准备,真的是头都要急炸了。那怎么能抓出这个凶手呢?SQL Trace, SQL Profile,SQL Trigger,Extended Events等着伺候你呢,更别说CLR,Service Broke
推荐度:
标签: sql server sqlserver
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top