• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
只是向上走
采菊东篱下,悠然见南山。
博客园    首页    新随笔    联系   管理    订阅  订阅
捕获数据库表的变化 -DBCC INPUTBUFFER sp_executesql
http://www.experts-exchange.com/Database/Miscellaneous/Q_24712470.html

DBCC INPUTBUFFER sp_executesql

If I use the DBCC INPUTBUFFER, I get the statement run as sp_executesql;1 which does not tell me about the actual statement executed.

I cannot use fn_get_sql as well, because I am firing a trigger and fn_get_sql will only catch the trigger statement not the stament which fired the trigger.

Please help me in determining the actual statement which is being run or may be the object id of the statement being run through dbcc inputbuffer.

Code Snippet:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
create TABLE DMLSOURCE 
(DML_ID int identity(1,1),
DML_CURRENT_USER nvarchar(100),
DML_SPID int,
DML_HOST_NAME nvarchar(100),
DML_APPNAME nvarchar(100),
DML_DATE datetime,
DML_TSQL nvarchar(max))
go
 
create TRIGGER TRG_DMLSOURCE
ON tblCustomer
FOR UPDATE
AS
IF UPDATE(tFirstName)
AND (SELECT COUNT(*) FROM INSERTED) > 0
BEGIN
SET NOCOUNT ON;
DECLARE @TSQL nvarchar(max)
DECLARE @IPB TABLE
(EVENTTYPE nvarchar(30),
PARAMETERS int,
EVENTINFO nvarchar(4000))
 
INSERT INTO @IPB
EXEC('DBCC INPUTBUFFER('+@@Spid+')')
SELECT @TSQL = EVENTINFO FROM @IPB
SELECT * from @IPB
 
INSERT INTO DMLSOURCE
(DML_CURRENT_USER, DML_SPID, DML_HOST_NAME, DML_APPNAME, DML_DATE, DML_TSQL)
VALUES
(CONVERT(nvarchar(100), CURRENT_USER),
@@spid,
host_name(),
app_name(),
getdate(),
@TSQL)
 
END 
 
GO

posted on 2009-09-17 15:52  jes.shaw  阅读(1266)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3