符合下表:如何跟踪由Microsoft SQL Server中的存储过程引起的更改流?
CREATE TABLE [Test]
(
[Id] BIGINT IDENTITY NOT NULL,
[Name] CHARACTER VARYING(255) NOT NULL,
[Description] CHARACTER VARYING(MAX) NOT NULL,
PRIMARY KEY([Id])
);
我控制的新记录创建与存储过程:
CREATE PROCEDURE [Test_Create]
@SessionId BINARY(32),
@Name CHARACTER VARYING(255),
@Description CHARACTER VARYING(MAX)
AS
BEGIN
BEGIN TRANSACTION;
BEGIN TRY
INSERT INTO [Test] ([Name], [Description])
VALUES (@Name, @Description);
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
THROW;
END CATCH
COMMIT TRANSACTION;
END
我有一个触发器,只需登录前后的值这个表,对所有变化。当我调用存储过程时,会触发此触发器并记录到另一个表。但是,我的触发器显然不能使用@SessionId
变量记录哪个网站用户会话导致存储过程被运行在Web服务器上的SQL客户端调用。我不想使用SET CONTEXT_INFO
,因为它在连接池和并行执行计划中不稳定。这就是说,我认为我可以将传入存储过程的@SessionId
与@@SPID
值关联起来,但这对连接池又有点棘手。据我所知,它不起作用。
我如何跟踪我的网站,该网站的用户,假设我对他们有一个唯一的会话数传递到我的存储过程,引起我的任何表的具体变化?
如果他们调用存储过程,我需要知道调用存储过程以及它是如何变更的表(之前和值后)。
是否有替代方法检索以下信息和将它们链接在一起形成审核跟踪?
- 网站用户/会话导致存储的过程被调用被调用
- 将所得数据之前和之后的查询
- 查询(的效果
- 存储的过程和它的参数数据)
你不能只将日志记录添加到'Test_Create'本身? – David
@David如果我这样做了,那么我需要为每个插入,更新或删除操作写入日志条目,然后再计算出旧值。这会增加很多额外的代码,可以通过触发来解决。我认为最好找出如何将来自存储过程上下文的'@ SessionId'和触发器上下文中的@@ SPID关联起来。 –