我在SQL Server 2012表上创建了一个触发器,将针对该表的所有INSERT,UPDATE和DELETE操作记录到另一个表中。我从http://sqlblog.com/blogs/jonathan_kehayias/archive/2010/01/11/tsql2sday-using-sys-dm-exec-sql-text-to-get-the-calling-statement.aspx的博客文章中获取了我的初始代码。
以下是测试表的脚本,我在测试表上记录更改的表,以及测试表上的触发器:
CREATE TABLE [dbo].[TestAddresses](
[RecNo] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](50) NULL,
[LastName] [varchar](50) NULL,
[Address] [varchar](50) NULL,
[City] [varchar](50) NULL,
[State] [varchar](2) NULL,
[Zip] [varchar](12) NULL
) ON [PRIMARY]
GO
-------------------------------------
CREATE TABLE [dbo].[TestAddressesLog](
[RecNo] [int] IDENTITY(1,1) NOT NULL,
[Sql] [nvarchar](max) NULL,
[Timestamp] [datetime] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[TestAddressesLog] ADD CONSTRAINT [DF_TestAddressesLog_Sql] DEFAULT (N'') FOR [Sql]
GO
ALTER TABLE [dbo].[TestAddressesLog] ADD CONSTRAINT [DF_TestAddressesLog_Timestamp] DEFAULT (getdate()) FOR [Timestamp]
GO
------------------------------------
ALTER TRIGGER [dbo].[TestAddressLogTrigger]
ON [dbo].[TestAddresses]
FOR INSERT, UPDATE, DELETE
AS
BEGIN
DECLARE @TEMP TABLE (EventType NVARCHAR(30), Parameters INT, EventInfo NVARCHAR(4000))
INSERT INTO @TEMP EXEC('DBCC INPUTBUFFER(@@SPID)')
INSERT INTO TestAddressesLog (Sql)
SELECT EventInfo FROM @TEMP
END
这对于没有参数的标准CRUD操作非常有用。但是,当我的.NET代码执行参数化操作时,如下所示(将某个值如'CA'赋值给@NewState):
UPDATE TestAddresses SET State = @NewState WHERE State = 'TX'
我得到以下结果:
(@NewState int)UPDATE TestAddresses SET State = @NewState WHERE State = 'TX'
我需要一种获取和记录传递参数值的方法。有人有解决方案吗?
答案 0 :(得分:0)
那不行。唯一的方法是使用扩展事件捕获RPC已完成事件,解析它们并保留它们。