SQL Server中事件探测器Profiler的使用
简单的新建一个跟踪就不在这里多说了。文件 --> 新建 --> 跟踪。(也可以直接使用功能按钮)
我们这里主要是讲一个精确的跟踪。
注:如果事件探测器在处理过程中检测到了Password,则事件探查器中根本看不到一句数据库SQL语句,所有的操作全部都用语句句柄来做了,看到最多的就是 exec sp_execute 11,1,即便在事件探查器中添加参数SP:StmtStaring,SP:StmtCompleted,也没有结果,探查器给替换了文本。真是万恶,这样就起到了隐藏代码的目的。
1、跟踪指定的数据库
有时我们机器上跑了几个服务,连了不止一个数据库,而我们又只想探测其中的一个或几个数据库。这时我们可以设置事件探测器的筛选条件。
① 文件 --> 属性 --> “筛选”选项卡。(注意:此时需要将运行的跟踪提前停止,这样才能在这里设置筛选条件,否则只能查看)
② 找到“DatabaseID”,然后将你需要探测的数据库的id填入即可。
查找数据库id的方法:(假设数据库名为scm02)
SELECT dbid FROM master.dbo.sysdatabases WHERE (name = 'scm02')
这里也有一个DatabaseName的筛选条件,我试了,但是没有效果,暂时不知道这个筛选条件是怎么用的。
2、设置筛选的数据列
我们新建跟踪时,默认选择的“跟踪模板”是SQLProfilerStander标准模板,里面筛选的数据列有些是不必要的。我们如果想把多余的筛选数据去掉的话,可以按如下操作:
文件 --> 属性 --> “数据列”选项卡。(注意:需要暂停当前跟踪)
筛选条件详解:(http://msdn.microsoft.com/zh-cn/library/ms175827.aspx)
数据列名称 |
数据类型 |
说明 |
列 ID |
可筛选 |
---|---|---|---|---|
ApplicationName |
nvarchar |
客户端应用程序的名称,该客户端应用程序创建了指向 SQL Server 实例的连接。 此列由应用程序传递的值填充,而不是由所显示的程序名填充。 |
10 |
是 |
ClientProcessID |
int |
主机为运行该客户端应用程序的进程分配的 ID。 如果客户端提供了客户端进程 ID,则填充此数据列。 |
9 |
是 |
CPU |
int |
用户在连接过程中使用的 CPU 时间(毫秒)。 |
18 |
是 |
DatabaseID |
int |
由 USE database 语句指定的数据库的 ID;如果未对给定实例发出 USE database 语句,则为默认数据库的 ID。 如果在跟踪中捕获 ServerName 数据列而且服务器可用,则 SQL Server Profiler 将显示数据库名。 可使用 DB_ID 函数来确定数据库的值。 |
3 |
是 |
DatabaseName |
nvarchar |
正在其中运行用户语句的数据库的名称。 |
35 |
是 |
Duration |
bigint |
用户自登录开始持续的时间(大约时间)。 |
13 |
是 |
EndTime |
datetime |
注销的结束时间。 |
15 |
是 |
EventClass |
int |
事件类型 = 15。 |
27 |
否 |
EventSequence |
int |
特定事件在请求中的顺序。 |
51 |
否 |
EventSubClass |
int |
登录使用的连接类型。 1 = 非共用,2 = 共用。 |
21 |
是 |
HostName |
nvarchar |
正在运行客户端的计算机的名称。 如果客户端提供了主机名,则填充此数据列。 若要确定主机名,请使用 HOST_NAME 函数。 |
8 |
是 |
IsSystem |
int |
指示事件是发生在系统进程中还是发生在用户进程中。 1 = 系统,0 = 用户。 |
60 |
是 |
LoginName |
nvarchar |
用户的登录名(SQL Server 安全登录名或 Microsoft Windows 登录凭据,格式为“DOMAIN\username”)。 |
11 |
是 |
LoginSid |
image |
登录用户的安全标识号 (SID)。 您可以在 sys.server_principals 目录视图中找到此信息。 服务器中的每个登录名都具有唯一的 SID。 |
41 |
是 |
NTDomainName |
nvarchar |
用户所属的 Windows 域。 |
7 |
是 |
NTUserName |
nvarchar |
Windows 用户名。 |
6 |
是 |
Reads |
bigint |
用户在连接过程中发出的逻辑读取 I/O 的数量。 |
16 |
是 |
RequestID |
int |
包含该语句的请求的 ID。 |
49 |
是 |
ServerName |
nvarchar |
所跟踪的 SQL Server 实例的名称。 |
26 |
|
SessionLoginName |
Nvarchar |
发起会话的用户的登录名。 例如,如果您使用 Login1 连接到 SQL Server,再以 Login2 的身份执行语句,则SessionLoginName 将显示 Login1,而 LoginName 将显示 Login2。 此列将同时显示 SQL Server 登录名和 Windows 登录名。 |
64 |
是 |
SPID |
int |
发生该事件的会话的 ID。 |
12 |
是 |
StartTime |
datetime |
该事件(如果存在)的启动时间。 |
14 |
是 |
Success |
int |
1 = 成功。 0 = 失败。 例如,值为 1 时表示权限检查成功;值为 0 时表示权限检查失败。 |
23 |
是 |
Writes |
bigint |
用户在连接过程中发出的逻辑写入 I/O 的数量。 |
17 |
是 |
GroupID |
int |
在其中激发 SQL 跟踪事件的工作负荷组的 ID。 |
66 |
是 |
3、探测数据库的连接名和密码、数据库id等
有时候我们使用数据库时不知道这个数据库的连接名和密码,有时还需要查看某个数据库的id(DatabaseID),这个时候我们就可以借助事件探测器来得到我们想要的数据。
新建一个跟踪,然后执行一条sql语句,可以是客户端执行,也可以是企业管理器或查询分析器中执行。
对应查看事件探测器中探测到的结果:
LoginName:连接名(一般为sa)
ClientProcessID:连接的密码(通常我们设置的是123)
DatabaseID:数据库的id(需要我们在筛选列中添加这一列)