如果TABLE B
中有更新,是否可以将记录插入TABLE A
?
我不想使用触发器。
答案是我们可以使用OUTPUT
子句代替触发器:
USE AdventureWorks2012;
GO
IF OBJECT_ID('dbo.vw_ScrapReason','V') IS NOT NULL
DROP VIEW dbo.vw_ScrapReason;
GO
CREATE VIEW dbo.vw_ScrapReason
AS (SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason);
GO
CREATE TRIGGER dbo.io_ScrapReason
ON dbo.vw_ScrapReason
INSTEAD OF INSERT
AS
BEGIN
--ScrapReasonID is not specified in the list of columns to be inserted
--because it is an IDENTITY column.
INSERT INTO Production.ScrapReason (Name, ModifiedDate)
OUTPUT INSERTED.ScrapReasonID, INSERTED.Name,
INSERTED.ModifiedDate
SELECT Name, getdate()
FROM inserted;
END
GO
INSERT vw_ScrapReason (ScrapReasonID, Name, ModifiedDate)
VALUES (99, N'My scrap reason','20030404');
GO
答案 0 :(得分:2)
执行此操作的机制称为triggers
。
说你想要这样做但不想使用触发器就像是说你想看埃菲尔铁塔,但你不想去法国。
如果你能确保所有数据更新将通过该存储过程,你可以编写一个存储过程来执行触发器中的所有逻辑。
答案 1 :(得分:2)
如果您不想使用触发器,那么您将有三个选项。
第一种方法是将所有插入/更新/删除包装在存储过程中。然后仅使用这些存储过程进行数据修改。这实际上是我通常采用的方法。
另一种方法是让流程定期运行,寻找数据的变化。这对于更新来说实际上很难做到。插入操作非常简单,因为您可以添加具有默认创建日期的列,以便您可以轻松找到最近添加的内容。
第三种方法是使用SQL Server更改跟踪(请参阅here)。
答案 2 :(得分:0)
您可以创建一个存储过程来执行表A中的更新和表B中的插入
CREATE PROCEDURE proc_name
@id
@param1
AS
BEGIN
update tableA
set field1 = @param1
where ID = @id
insert into tableB(field1)
values(@param1)
END