복붙노트

[SQL] 어떻게 SQL 서버와 갱신 전의 트리거를 할 수 있습니까?

SQL

어떻게 SQL 서버와 갱신 전의 트리거를 할 수 있습니까?

나는 SQLSERVER 표현 사용하고 난 업데이트 트리거 이전 할 수 없습니다. 그렇게 할 수있는 다른 방법이?

해결법

  1. ==============================

    1.MSSQL은 BEFORE 트리거를 지원하지 않습니다. 당신이 가진 가장 가까운 대신 OF 트리거하지만 그들의 행동은 MySQL은 BEFORE 트리거의 그것과 다르다.

    MSSQL은 BEFORE 트리거를 지원하지 않습니다. 당신이 가진 가장 가까운 대신 OF 트리거하지만 그들의 행동은 MySQL은 BEFORE 트리거의 그것과 다르다.

    당신은 여기에 대해 더 배우고, 대신 트리거의 노트 수 있습니다 "트리거가 이렇게 트리거 문의 행동을 무시하고 대신 트리거 SQL 문으로 실행되도록 지정합니다." 트리거가 제대로 처리 / 작성되지 않은 경우 따라서, 업데이트에 대한 조치가 발생하지 않을 수 있습니다. 계단식 행동도 영향을받습니다.

    대신 당신이 달성하려고하는 것과 다른 접근 방법을 사용할 수 있습니다.

  2. ==============================

    2.MSSQL에서 "트리거하기 전에"이없는 것이 사실이다. 그러나 여전히 함께 "삽입"및 "삭제"테이블을 사용하여 테이블에 수행 된 변경 사항을 추적 할 수 있습니다. 업데이트가 불에 트리거가 발생하면, "삽입"테이블에는 새 값과 "삭제"테이블에는 이전 값. 이 정보를 가진 후에는 상대적으로 쉽게 "트리거 전에"동작을 시뮬레이션 할 수있다.

    MSSQL에서 "트리거하기 전에"이없는 것이 사실이다. 그러나 여전히 함께 "삽입"및 "삭제"테이블을 사용하여 테이블에 수행 된 변경 사항을 추적 할 수 있습니다. 업데이트가 불에 트리거가 발생하면, "삽입"테이블에는 새 값과 "삭제"테이블에는 이전 값. 이 정보를 가진 후에는 상대적으로 쉽게 "트리거 전에"동작을 시뮬레이션 할 수있다.

  3. ==============================

    3.이 SQL Server Express를 적용,하지만 여전히 업데이트 후 "이전"데이터가 트리거가 발생하는 경우에도 액세스 할 수 있는지 경우가 될 수 없습니다. 당신은 테이블이 변경 될 때 즉시 생성 삭제 또는 삽입 테이블 중 하나에서 데이터를 읽을 필요가있다. 이 @Stamen의 말씀 본질적으로,하지만 난 아직도 그 (도움!) 대답을 이해하는 것이 더 조사 할 필요가 있었다.

    이 SQL Server Express를 적용,하지만 여전히 업데이트 후 "이전"데이터가 트리거가 발생하는 경우에도 액세스 할 수 있는지 경우가 될 수 없습니다. 당신은 테이블이 변경 될 때 즉시 생성 삭제 또는 삽입 테이블 중 하나에서 데이터를 읽을 필요가있다. 이 @Stamen의 말씀 본질적으로,하지만 난 아직도 그 (도움!) 대답을 이해하는 것이 더 조사 할 필요가 있었다.

    당신은 예를 들어, 해당 테이블 중 하나에서 데이터를 읽을 수있는 트리거를 만들 수 있습니다

    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

    SQL 서버 트리거

  4. ==============================

    4.다른 RDBMS에에서 발견 T-SQL 지원은 AFTER 및 INSTEAD OF 트리거, 그것은는 BEFORE 트리거 기능하지 않습니다.

    다른 RDBMS에에서 발견 T-SQL 지원은 AFTER 및 INSTEAD OF 트리거, 그것은는 BEFORE 트리거 기능하지 않습니다.

    나는 당신이 INSTEAD OF 트리거 사용하고자하는 것으로 판단된다.

  5. ==============================

    5.SQL 서버의 모든 "정상"트리거 "후 ..."트리거입니다. 더 "전 ..."트리거가 없습니다.

    SQL 서버의 모든 "정상"트리거 "후 ..."트리거입니다. 더 "전 ..."트리거가 없습니다.

    갱신 전에 뭔가를하려면, UPDATE 트리거 대신 체크 아웃.

  6. ==============================

    6.나는 트릭을 사용하는 SQL 서버에 BEFORE UPDATE를 수행합니다. 나는 레코드의 이전 이미지를 얻을 같은 방법으로 레코드 (UPDATE 테이블 SET 필드 = 필드)의 잘못된 갱신을한다.

    나는 트릭을 사용하는 SQL 서버에 BEFORE UPDATE를 수행합니다. 나는 레코드의 이전 이미지를 얻을 같은 방법으로 레코드 (UPDATE 테이블 SET 필드 = 필드)의 잘못된 갱신을한다.

  7. ==============================

    7.당신이 대신 트리거를 사용할 때 특히 트리거로 지정하지 않는 한, 그것은 삽입을 저지하지 않을 것을 기억하십시오. 정말 방법이 대신 평소 무엇을 대신에, 정상적인 삽입 작업 중 어떤 것도 일어나지 않을 것 때문에.

    당신이 대신 트리거를 사용할 때 특히 트리거로 지정하지 않는 한, 그것은 삽입을 저지하지 않을 것을 기억하십시오. 정말 방법이 대신 평소 무엇을 대신에, 정상적인 삽입 작업 중 어떤 것도 일어나지 않을 것 때문에.

  8. ==============================

    8.전체 예 :

    전체 예 :

    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
    
  9. from https://stackoverflow.com/questions/642822/how-can-i-do-a-before-updated-trigger-with-sql-server by cc-by-sa and MIT license