programing

SQL 서버에서 업데이트 전 트리거를 수행하려면 어떻게 해야 합니까?

cafebook 2023. 8. 21. 21:38
반응형

SQL 서버에서 업데이트 전 트리거를 수행하려면 어떻게 해야 합니까?

SQL Server Express를 사용하고 있는데 사용할 수 없습니다.before updated방아쇠를 당기다다른 방법이 있나요?

MSSQL에 "트리거 전"이 없는 것은 사실입니다.그러나 "삽입" 및 "삭제" 테이블을 함께 사용하여 테이블에서 변경된 내용을 추적할 수 있습니다.업데이트로 인해 트리거가 발생하면 "삽입" 테이블에는 새 값이 저장되고 "삭제" 테이블에는 이전 값이 저장됩니다.이 정보를 얻으면 "트리거 전" 동작을 비교적 쉽게 시뮬레이션할 수 있습니다.

MSSQL은 지원하지 않습니다.BEFORE트리거.당신이 가진 가장 가까운 것은INSTEAD OF트리거하지만 그들의 행동은 그것과 다릅니다.BEFOREMySQL에서 트리거합니다.

당신은 여기에서 그것들에 대해 더 배울 수 있고 참고할 수 있습니다.INSTEAD OFtrigger "트리거 SQL 문 대신 트리거를 실행하여 트리거 문의 작업을 재정의하도록 지정합니다."따라서 트리거가 제대로 작성/처리되지 않으면 업데이트에 대한 작업이 수행되지 않을 수 있습니다.계단식 작업도 영향을 받습니다.

대신 여러분은 여러분이 성취하고자 하는 것에 대해 다른 접근법을 사용하기를 원할 수도 있습니다.

이것이 SQL Server Express에 적용되는지 확실하지 않지만 트리거가 업데이트 후에 발생하더라도 "이전" 데이터에 액세스할 수 있습니다.테이블을 변경할 때 즉시 생성되는 삭제되거나 삽입된 테이블에서 데이터를 읽어야 합니다.이것은 @Stamen이 기본적으로 말하는 것이지만, 저는 여전히 그 (도움이 되는!) 대답을 이해하기 위해 더 탐구할 필요가 있었습니다.

삭제된 테이블은 DELETE 및 UPDATE 문을 실행하는 동안 영향을 받는 행의 복사본을 저장합니다.DELETE 또는 UPDATE 문을 실행하는 동안 행이 트리거 테이블에서 삭제되고 삭제된 테이블로 전송됩니다...

삽입된 테이블은 INSERT 및 UPDATE 문 동안 영향을 받는 행의 복사본을 저장합니다.삽입 또는 업데이트 트랜잭션 중에 새 행이 삽입된 테이블과 트리거 테이블 모두에 추가됩니다...

https://msdn.microsoft.com/en-us/library/ms191300.aspx

따라서 이러한 테이블 중 하나에서 데이터를 읽기 위한 트리거를 만들 수 있습니다.

CREATE TRIGGER <TriggerName> ON <TableName>
AFTER UPDATE
AS
  BEGIN
    INSERT INTO <HistoryTable> ( <columns...>, DateChanged )
    SELECT <columns...>, getdate()
    FROM deleted;
  END;

제 예는 여기에 있는 예를 기반으로 합니다.

http://www.seemoredata.com/en/showthread.php?134-Example-of-BEFORE-UPDATE-trigger-in-Sql-Server-good-for-Type-2-dimension-table-updates

T-SQL은 트리거가 아닌 AFTER 및 RESBMS에서만 지원되며, 일부 다른 RDBMS에서 볼 수 있듯이 BEAPE 트리거를 지원하지 않습니다.

저는 당신이 트리거 대신에 사용하기를 원할 것이라고 믿습니다.

SQL Server의 모든 "정상" 트리거는 "AFTER..." 트리거입니다."BEFORE ..." 트리거는 없습니다.

업데이트 전에 작업을 수행하려면 트리거 업데이트 대신 체크아웃하십시오.

를 것BEFORE UPDATESQL Server에서 트릭을 사용합니다.합니다.UPDATE Table SET Field = Field으로 저는 .), 그런식으레이전이얻를습다니지미의코드로▁),다얻.

업데이트되거나 삭제된 값은 DELETED에 저장됩니다.우리는 트리거에서 아래의 방법으로 그것을 얻을 수 있습니다.

전체 예제,

CREATE TRIGGER PRODUCT_UPDATE ON PRODUCTS
FOR UPDATE 
AS
BEGIN
DECLARE @PRODUCT_NAME_OLD VARCHAR(100)
DECLARE @PRODUCT_NAME_NEW VARCHAR(100)

SELECT @PRODUCT_NAME_OLD = product_name from DELETED
SELECT @PRODUCT_NAME_NEW = product_name from INSERTED

END

대신 트리거를 사용하는 경우 트리거에서 특별히 지시하지 않는 한 삽입이 커밋되지 않습니다.실제 수단 대신 일반적으로 수행하는 작업 대신 이 작업을 수행하면 일반적인 삽입 작업이 발생하지 않습니다.

전체 예:

CREATE TRIGGER [dbo].[trig_020_Original_010_010_Gamechanger]
   ON  [dbo].[T_Original]
   AFTER UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @Old_Gamechanger int;
    DECLARE @New_Gamechanger int;

    -- Insert statements for trigger here
    SELECT @Old_Gamechanger = Gamechanger from DELETED;
    SELECT @New_Gamechanger = Gamechanger from INSERTED;

    IF @Old_Gamechanger != @New_Gamechanger

        BEGIN

            INSERT INTO [dbo].T_History(ChangeDate, Reason, Callcenter_ID, Old_Gamechanger, New_Gamechanger)
            SELECT GETDATE(), 'Time for a change', Callcenter_ID, @Old_Gamechanger, @New_Gamechanger
                FROM deleted
            ;

        END

END

언급URL : https://stackoverflow.com/questions/642822/how-can-i-do-a-before-updated-trigger-with-sql-server

반응형