gpt4 book ai didi

sql - 禁止在某些条件下插入表

转载 作者:搜寻专家 更新时间:2023-10-30 20:10:32 27 4
gpt4 key购买 nike

我有一个 SQL Server 2008 数据库。连接了三个端子(A、B、C)。数据库中有一个表SampleTable,它对任何终端事件使用react。每次在任何终端上有一些事件时,登录到此数据库,新行就会插入到 SampleTable 中。

我想重定向来自三个终端之一 (C) 的流量以写入表 RealTable 而不是 SampleTable,但我必须在数据库层执行此操作,因为将终端事件写入数据库的服务位于黑盒中。

我已经有一些触发器使用重定向逻辑在 SampleTable 上工作,但问题是行仍然被插入到 SampleTable 中。

什么是最干净的解决方案。我确信在插入触发器中删除行是非常糟糕的,非常糟糕。

请帮忙。

编辑:

我们目前的逻辑是这样的(这是伪代码):

ALTER TRIGGER DiffByTerminal
ON SampleTable
AFTER INSERT
AS
DECLARE @ActionCode VARCHAR(3),
@ActionTime DATETIME,
@TerminalId INT

SELECT @ActionCode = ins.ActionCode,
@ActionTime = ins.ActionTime,
@TerminalId = ins.TerminalId
FROM inserted ins

IF(@TerminalId = 'C')
BEGIN

INSERT INTO RealTable
(
...
)
VALUES
(
@ActionCode,
@ActionTime,
@TerminalId
)
END

最佳答案

为了在将行插入表之前“拦截”某些内容,您需要一个INSTEAD OF 触发器,而不是一个AFTER 触发器。因此,您可以删除现有的触发器(其中还包括假设所有插入都是单行的有缺陷的逻辑)并改为创建此 INSTEAD OF 触发器:

DROP TRIGGER DiffByTerminal;
GO

CREATE TRIGGER dbo.DiffByTerminal
ON dbo.SampleTable
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;

INSERT dbo.RealTable(...) SELECT ActionCode, ActionTime, TerminalID
FROM inserted
WHERE TerminalID = 'C';

INSERT dbo.SampleTable(...) SELECT ActionCode, ActionTime, TerminalID
FROM inserted
WHERE TerminalID <> 'C';
END
GO

这将处理由(a)仅 C(b)仅非 C 和(c)混合组成的单行插入和多行插入。

关于sql - 禁止在某些条件下插入表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15615314/

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