gpt4 book ai didi

tsql - 在 SELECT 之前保证 T-SQL 存储过程插入?

转载 作者:行者123 更新时间:2023-12-04 06:22:28 26 4
gpt4 key购买 nike

我有一个从 SQL Server 2008 数据库中检索敏感信息的存储过程。我想修改该过程,以便在任何时候调用它时,它都会在单独的表中记录有关谁调用它的信息。

我认为类似以下内容会起作用:

declare @account varchar(255);
set @account = (SELECT SYSTEM_USER);

INSERT into AUDIT_LOG(ACCOUNT, TSTAMP)
VALUES(@account, getdate())
;

--Now fetch data
SELECT x,y,z from sensitive_info;

我的问题是客户端应用程序可以调用此存储过程并获取敏感信息,但不提交连接并且 INSERT 永远不会发生!

有没有办法强制 INSERT 在 SELECT 之前发生?

我正在使用 SQL Server 2008。

谢谢,
卡尔

最佳答案

只有在事务已启动时才 COMMIT。

因此,您可以先测试打开的事务并禁止读取。这将确保没有要回滚的事务打开。我在这里使用了 XACT_STATE()

使用 SET XACT_ABORT ON 和 TRY/CATCH 也意味着用于记录的 INSERT 也必须在读取发生之前发生。 INSERT 上的任何错误都将转到 CATCH 块。所以没有读取和日志记录失败本身也可以被记录下来。

所以:这是您对“仅在登录时读取”的保证

进行显式事务无济于事:INSERT 无论如何都是原子操作。如果被调用者打开一个事务,日志条目可以回滚

CREATE PROC getSecretStuff
AS
SET NOCOUNT, XACT_ABORT ON;

BEGIN TRY
IF XACT_STATE() <> 0
RAISERRROR ('Call not allowed in an active transaction', 16, 1)

INSERT into AUDIT_LOG(ACCOUNT, TSTAMP)
VALUES(SYSTEM_USER, getdate());

--Now fetch data
SELECT x,y,z from sensitive_info;

END TRY
BEGIN CATCH
-- error handling etc
END CATCH
GO

关于tsql - 在 SELECT 之前保证 T-SQL 存储过程插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6386346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com