2017-03-02 1 views
0

의 테이블에 대한 트리거 만드는 방법 : "RECORD_ID는"기본 키입니다나는 다음과 같은 테이블이 SQL 서버 2008

CREATE TABLE [RTS].[MFB] 
(
    [record_id] [int] IDENTITY(1,1) NOT NULL, 
    [marker_id] [nvarchar](50) NULL, 
    [lat] [numeric](38, 8) NULL, 
    [lng] [numeric](38, 8) NULL, 
    [address] [nvarchar](512) NULL, 
    [hash] [smallint] NULL, 
    [updated] [datetime] NULL, 
    [first_created_date] [datetime] NULL, 

    CONSTRAINT [PK_MFB_1] 
     PRIMARY KEY CLUSTERED ([record_id] ASC) 
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
        IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

합니다.

INSERT 작업 후에 트리거를 만들어야합니다.

조건은 다음 marker_id 열이 새로운 경우

  1. INSERT 상기 테이블에 기록하고 0으로 설정 hash 칼럼;
  2. marker_id이 이미있는 경우 새 updated 열을 설정하여 기존 레코드 UPDATE을 저장합니다.
  3. marker_id이 이미 존재하고 "lat", "lng"및 "address"중 하나가 변경된 경우 새로운 "lat", "lng"및/또는 "address"를 설정하여 기존 레코드를 UPDATE 또한 "해시"를 "1"로 설정합니다.

기본적으로 MFB 테이블은 marker_id과 중복되어서는 안됩니다.

트리거를 설정하여 어떻게이 작업을 수행 할 수 있습니까? 감사!

+0

삽입, 업데이트 및 삭제 후에 트리거되므로 트리거를 통해 삽입 또는 업데이트 할 수 없습니다. 이 테이블의 이벤트를 기반으로 다른 테이블 (좋은 예는'LOG' 테이블)에 대해이 작업을 수행 할 수 있습니다. – Susang

+1

방아쇠를 사용하지 말 것을 제안합니다. 'marker_id' 컬럼에 유일한 인덱스를 생성하고이 테이블에 대한 변경 사항이 이러한 비즈니스 규칙을 적용하는 저장 프로 시저를 통해서만 발생하는지 확인하십시오. 그럼에도 불구하고 이미 시도한 내용을 보여줄 필요가 있습니다. 아무도 코드를 작성하지 않습니다. –

답변

1

라팔은 맞다하지만 당신은 대량 삽입 및 업데이트에 대한 커서를 만들 수 있지만 내가 그것을이

CREATE TRIGGER DBO.MFBTRG 
    ON DBO.MFB 
    INSTEAD OF INSERT,UPDATE 
AS 
BEGIN 
DECLARE @marker_id NVARCHAR(50) 
DECLARE @lat NUMERIC(38,8) 
DECLARE @lng NUMERIC(38,8) 
DECLARE @address NVARCHAR(512) 
DECLARE @hash SMALLINT 
DECLARE @updated DATETIME 
DECLARE @first_created_date DATETIME 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

DECLARE MFBINS CURSOR FAST_FORWARD FOR Select [marker_id],[lat],[lng],[address],[hash],[updated],[first_created_date] FROM INSERTED 
OPEN MFBINS 
FETCH NEXT FROM MFBINS INTO @marker_id,@lat,@lng,@address,@hash,@updated,@first_created_date 
     WHILE (@@FETCH_STATUS=0) 
     BEGIN 

IF NOT EXISTS (SELECT [marker_id] FROM MFB WHERE [marker_id]= @marker_id) 
BEGIN 
INSERT INTO [dbo].[MFB] ([marker_id],[lat],[lng],[address],[hash],[updated],[first_created_date]) 
      VALUES (@marker_id,@lat,@lng,@address,@hash,@updated,@first_created_date) 
END 
ELSE 
BEGIN 
UPDATE MFB SET [updated][email protected] WHERE [marker_id][email protected]_id 
END 


    -- Insert statements for trigger here 
FETCH NEXT FROM MFBINS INTO @marker_id,@lat,@lng,@address,@hash,@updated,@first_created_date 
END 
CLOSE MFBINS 
DEALLOCATE MFBINS 
END 
GO 

같아야 성능을 약속하지 못할 및 업데이트 트리거에 대한 업데이트가 함께하는 열을 감지하는 데 사용할 수있는

IF UPDATE(COLUMN_NAME) 
BEGIN 
UPDATE LOGİC 
END 
1

정말로이 방법으로 삽입 트리거를 작성해야하지만 대량 삽입의 이점을 누리지 못하면 속도가 느려질 수 있으므로 조심하십시오.

또는 MERGE 문을 사용하여 INSERT/UPDATE 시나리오를 수행 할 수 있습니다.

관련 문제