【发布时间】:2016-12-09 06:09:51
【问题描述】:
我有以下情况:
CREATE TABLE dbo.Orders
(
OrderID int IDENTITY (1,1) NOT NULL
, OrderVersion int DEFAULT(1)
, Customer varchar(30)
, ScheduleDate date
, PaymentOption int
);
CREATE TABLE dbo.OrdersItems
(
OrderItemsID int IDENTITY (1,1) NOT NULL
, OrderID int
, Product varchar(100)
, Qty int
, value decimal(18,2)
);
CREATE TABLE dbo.logOrders
(
OrderID int NOT NULL
, OrderVersion int DEFAULT(1)
, Customer varchar(30)
, ScheduleDate date
, PaymentOption int
);
CREATE TABLE dbo.logOrdersItems
(
OrderItemsID int NOT NULL
, OrderID int
, Product varchar(100)
, Qty int
, value decimal(18,2)
);
-- Insert values into the table.
INSERT INTO dbo.Orders (Customer , ScheduleDate, PaymentOption)
VALUES ('John', 2016-09-01, 1);
INSERT INTO dbo.OrdersItems( OrderId, Product, Qty, Value)
VALUES (1, 'Foo', 20, 35.658),
(1, 'Bla', 50, 100)
(1, 'XYZ', 10, 3589)
第一句话
UPDATE Orders set ScheduleDate = 2016-10-05 WHERE OrderId = 1
第二个陈述
Delete From OrdersItems WHERE OrderItemsID = 2
UPDATE OrdersItems set Qty = 5 WHERE OrderItemsID = 1
第三条语句
Update Orders set PaymentOption = 2 WHERE OrderId = 1
Update OrdersItems set Value = 1050 WHERE OrderItemsID = 3
我试图弄清楚如何在上面的每个语句示例之后在日志表上插入更改之前的数据。并在表 Orders 上将 OrderVersion 设置为 OrderVersion + 1。 因此,在日志表上,我将拥有后一个版本之后的所有版本。
是否可以在 UPDATE、DELETE、INSERT 语句之前创建一个触发器来监视两个表并执行获取原始数据以获取原始数据并在 logTables 上插入?
这里有一个示例来更好地解释我想要的结果。
This is the Initial Data on table Orders and OrdersItems
如果我对订单(任何列)进行更新或对 OrdersItems 进行更新、插入、删除,我需要分别在 logTables 上插入图像上的数据。 有了这个,我将在 logOrders 和 logItems 上获得原始数据,在 Orders 和 Items 上获得更改后的数据。
我希望我能更好地解释我的意思。
【问题讨论】:
-
您可以通过触发器实现您想要的(在日志中插入更改前的数据表),但是您的要求还不够清楚,请您用一些示例进行解释并一起解释,包括预期结果
-
只能为单个表指定 dml 触发器。但是,您可以为将处理更新、删除和插入的每个表创建一个触发器。
标签: sql-server tsql sql-server-2014 database-trigger