2013-08-20 3 views
0

업데이트가 TABLE A 인 경우 TABLE 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 
+2

일부 행이 업데이트되었지만 트리거를 사용하지 않으려는 경우 표에 행을 자동으로 삽입하려는 경우 원하는 내용입니까? – Lamak

+3

[OUTPUT]을 살펴보십시오 (http://technet.microsoft.com/us-en/library/ms177564.aspx) – bummi

+0

트리거를 사용하지 않으려는 경우 원하는 작업을 트리거 할 수있는 항목 ? –

답변

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 
2

이렇게하는 메커니즘을 triggers이라고합니다.

당신이 이것을하고 싶지만 방아쇠를 사용하고 싶지는 않는다고 말하는 것은 당신이 에펠 탑을보고 싶다고하지만 프랑스에 가고 싶지 않다고 말하는 것과 같습니다.

모든 데이터 업데이트이 저장 프로 시저를 통해 수행되도록하려면 트리거에 있던 모든 논리를 수행하는 저장 프로 시저를 작성할 수 있습니다.

2

트리거를 사용하지 않으려면 세 가지 옵션이 있습니다.

첫 번째는 저장 프로 시저에서 모든 삽입/업데이트/삭제를 래핑하는 것입니다. 그런 다음 데이터 수정을 위해 이러한 저장 프로 시저 만 사용하십시오. 이것은 실제로 내가 일반적으로 취하는 접근법입니다.

주기적으로 데이터 변경을 찾는 프로세스가 있어야합니다. 이것은 실제로 업데이트하기가 어렵습니다. 기본 작성 날짜가있는 열을 추가 할 수 있기 때문에 삽입하기가 매우 쉽기 때문에 최근에 추가 된 것을 쉽게 찾을 수 있습니다.

세 번째 방법은 SQL Server 변경 내용 추적 (here 참조)을 사용하는 것입니다.

관련 문제