【发布时间】:2014-06-16 00:51:06
【问题描述】:
附下表:
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 如果我这样做,那么我需要为每个插入、更新或删除写入日志条目,然后还要弄清楚旧值是什么。这将添加许多可以通过触发器解决的额外代码。我认为最好弄清楚如何将存储过程上下文中的
@SessionId与触发器上下文中的@@SPID关联起来。
标签: sql-server tsql audit