Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 表上的更新必须插入到另一个表中_Sql_Sql Server_Tsql_Triggers_Sql Server 2008 R2 - Fatal编程技术网

Sql 表上的更新必须插入到另一个表中

Sql 表上的更新必须插入到另一个表中,sql,sql-server,tsql,triggers,sql-server-2008-r2,Sql,Sql Server,Tsql,Triggers,Sql Server 2008 R2,如果表a中有更新,是否有办法将记录插入表B 我不想使用触发器 答案是我们可以使用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

如果
表a中有更新,是否有办法将记录插入
表B

我不想使用触发器


答案是我们可以使用
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

您可以创建一个存储过程来执行表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

您可以创建一个存储过程来执行表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

执行此操作的机制称为
触发器

说你想这样做但不想使用触发器就像说你想看埃菲尔铁塔,但你不想去法国


我想,您可以编写一个存储过程来执行触发器中的所有逻辑,如果您可以确保所有数据更新都将通过该存储过程进行。

执行此操作的机制称为
触发器

说你想这样做但不想使用触发器就像说你想看埃菲尔铁塔,但你不想去法国


我想,您可以编写一个存储过程来执行触发器中的所有逻辑,如果您可以确保所有数据更新都将通过该存储过程进行。

如果您不想使用触发器,那么您将有三个选项

第一种方法是在存储过程中包装所有插入/更新/删除。然后仅使用这些存储过程修改数据。这实际上是我通常采取的方法

另一种方法是有一个周期性运行的进程来查找对数据的更改。对于更新来说,这实际上很难做到。插入操作非常容易,因为您可以添加具有默认创建日期的列,因此您可以轻松找到最近添加的内容


第三种方法是使用SQL Server更改跟踪(请参阅)

如果不想使用触发器,那么有三个选项

第一种方法是在存储过程中包装所有插入/更新/删除。然后仅使用这些存储过程修改数据。这实际上是我通常采取的方法

另一种方法是有一个周期性运行的进程来查找对数据的更改。对于更新来说,这实际上很难做到。插入操作非常容易,因为您可以添加具有默认创建日期的列,因此您可以轻松找到最近添加的内容


第三种方法是使用SQL Server更改跟踪(请参阅)

如果某些行被更新,您想在表中自动插入行,但您不想使用触发器,这就是您要问的吗?看看如果您不想使用触发器,将触发什么?Kumar,是的,可以这样做,使用触发器…如果您可以更改
更新
查询,然后您可以使用@bummi提到的
OUTPUT
子句。如果你不能,那么你至少需要考虑你的选项中的触发器。你为什么不想用它们呢?你的问题中为什么会有触发器的开头?如果某些行被更新,你想在表上自动插入行,但你不想使用触发器,这就是你要问的吗?看看如果你不想使用触发器,什么会触发你想做的事?@Kumar,是的,可以这样做,使用触发器…如果可以更改
UPDATE
查询,则可以使用@bummi提到的
OUTPUT
子句。如果你不能,那么你至少需要考虑你的选项中的触发器。你为什么不想用它们呢?为什么在你的问题中有一个触发点?