【发布时间】:2013-03-25 12:45:39
【问题描述】:
我有一个 SQL Server 2008 数据库。有三个端子连接到它(A、B、C)。数据库中有一个表SampleTable,它对任何终端活动作出反应。每次登录到此数据库的任何终端上都有一些活动时,新行将插入到SampleTable。
我想将来自三个终端之一 (C) 的流量重定向到表 RealTable 而不是 SampleTable,但我必须在 DB 层执行此操作,因为将终端活动写入 DB 的服务位于黑盒中。
我已经有一些使用重定向逻辑在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触发器的完美使用 -
我们无法更改行插入的逻辑,因此它需要是触发器或类似触发器的东西。 @JNK 请查看我编辑的答案。
-
这是不可能的。如果您在 SampleTable 中插入两行(例如
INSERT ... SELECT something UNION ALL SELECT something else,则上述触发代码只会在 RealTable 中插入任意一行。 -
@nzic 仍然是一件非常危险的事情。明天有人可能会编写一个新方法,它不会盲目地遵守这种逐行要求(这也是低效的),当然你不能阻止任何人一开始就绕过你的应用程序并编写他们自己的广告——临时插入。
标签: sql database sql-server-2008 triggers insert-into