2016-12-14 1 views
0

O.F., 업데이트 트리거 데이터를 추가 두 번 열

그래서 나는 행이 다른 테이블에 업데이트 될 때를 기반으로 테이블을 업데이트하는 트리거를 구축하기 위해 시도 된 것으로. 지금까지의 방아쇠는 이렇게 보입니다.

ALTER TRIGGER [dbo].[tst_update_USCATVLS_6] 
    ON [dbo].[IV00101] 
    AFTER UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    DECLARE @ITEMNUMBER VARCHAR(75) 

    SET @ITEMNUMBER = (SELECT ITEMNMBR FROM dbo.IV00101 WHERE DEX_ROW_TS = (SELECT MAX(DEX_ROW_TS) FROM dbo.IV00101)) 

    UPDATE dbo.EXT00101 SET STRGA255 = (RTRIM(LTRIM(STRGA255))) + '_0' WHERE PT_UD_KEY = @ITEMNUMBER AND PT_UD_Number = 2 

아래와 같은 테스트 업데이트를 실행하면 어떻게 될지.

UPDATE PDM.TEST.dbo.IV00101 
     SET USCATVLS_6 = 'OBSOLETE' 
WHERE ITEMNMBR = 'HMLGDN-7563252-4' 

트리거가 작동하지만 원하는 열을 두 번 업데이트합니까? 최종 결과는이 20025947756319_0 대신 20025947756319_0_0이됩니다.

이 모든 이상한 부분은 트리거를 삭제하고 동일한 테스트 업데이트를 실행 한 다음 모든 문이 실행되는 트리거 문에 있던 업데이트 문을 실행하면 데이터가 원하는대로 업데이트됩니다. 하나 개의 코드 블록이 작품으로

그래서이 실행 :

UPDATE PDM.TEST.dbo.IV00101 
     SET USCATVLS_6 = 'OBSOLETE' 
WHERE ITEMNMBR = 'HMLGDN-7563252-4' 

DECLARE @ITEMNUMBER VARCHAR(75) 

SET @ITEMNUMBER = (SELECT ITEMNMBR FROM PDM.TEST.dbo.IV00101 WHERE DEX_ROW_TS = (SELECT MAX(DEX_ROW_TS) FROM PDM.TEST.dbo.IV00101)) 

UPDATE PDM.TEST.dbo.EXT00101 SET STRGA255 = (RTRIM(LTRIM(STRGA255))) + '_0' WHERE PT_UD_KEY = @ITEMNUMBER AND PT_UD_Number = 2 

어떤 일이 내가 그것을 대단히 감사하겠습니다 일어나고 왜 저를 알아내는 데 도움이 할 수 있습니다.

친절한 안부 Z.

+1

트리거는 두 가지 결함을 가지고있다. 첫 번째는 오직 하나의 행만 업데이트 될 것이라고 가정하는 것입니다. 이것은 트리거가 SQL Server에서 작동하는 방식이 아닙니다. 1 회에 한 번이 아니라 한 번씩 작동합니다. 두 번째 결함은 삽입 또는 삭제 된 가상 테이블을 참조하지 않는다는 것입니다. 즉, 테이블의 행을 업데이트 할 때마다 테이블의 모든 행을 업데이트합니다. –

+0

@Sean Lange 삽입 된 테이블과 삭제 된 테이블을 참조하는 것에 대한 조언에 따라 두 개의 임시 테이블에서 데이터를 볼 수 있도록 다른 트리거를 만들었습니다. 내가 업데이트 문을 실행하면 삽입 및 삭제 테이블에 두 번 나타납니다 다시 각 테이블에 대해 4 별도의 데이터 세트를 2입니다. 고유 한 항목에 대한 정상 출력입니까? – Zajac

답변

0

숀 랭의 댓글 내가 삽입 및 삭제 테이블을 고개를 읽고서. 이전에이 테이블에 대한 참조를 보았지만 임시 테이블이라는 사실을 알지 못했고 예제/응답에서 데이터베이스의 실제 테이블이라고 생각했습니다. 어쨌든 나는 각각의 데이터를 보여주기위한 방아쇠를 만들었는데, 방아쇠의 update 문과 조인하는 방법을 알게되었습니다. 모든 코드는 아래와 같습니다.

트리거뿐만 아니라 삽입 및 삭제에 무슨 볼로 삽입 된 테이블을 참조하는 조인

ALTER TRIGGER [dbo].[inserted_deleted_Table] 
    ON [dbo].[IV00101] 
    AFTER UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

select 'NEW DATA', * from inserted --new data 

select 'OLD Data', * from deleted --old data 

select 'iv00101', * From iv00101 as i JOIN inserted as u on i.itemNmbr = u.itemNmbr and i.DEX_ROW_TS = u.DEX_ROW_TS 
    -- Insert statements for trigger here 

END 

최종 솔루션은이 코드의 peice 제거했다 :

SET @ITEMNUMBER = (SELECT ITEMNMBR FROM INV00101 WHERE DEX_ROW_TS = (SELECT MAX(DEX_ROW_TS) FROM INV00101) AND USCATVLS_6 ='OBSOLETE') 

을 그리고 UPDATE 문에 FROM 절을 추가하십시오.

UPDATE PDM.TEST.dbo.EXT00101 SET STRGA255 = (RTRIM(LTRIM(STRGA255))) + '_0' 
    FROM (
      SELECT u.ITEMNMBR , 
        u.DEX_ROW_TS 
      From iv00101 as i JOIN inserted as u on i.itemNmbr = u.itemNmbr and i.DEX_ROW_TS = u.DEX_ROW_TS) as p 
    WHERE PT_UD_KEY = p.ITEMNMBR AND PT_UD_Number = 2 

일단 삽입하면 및 삭제 된 테이블 임시 테이블 DB에 실제 테이블이 아니라 모든 조각 일종의 장소로 떨어졌다. @Sean Lange로 갈 필요가있는 방향으로 나를 가리켜 주셔서 감사합니다.

최고 감사합니다, Z.

+0

당신을 위해 일해주는 기쁘게 생각합니다. 방아쇠에 스칼라 변수가있을 때 커다란 붉은 깃발이 있어야 여러 행을 허용 할 수 있다는 점을 명심하십시오. 새 버전이 그렇게 될 것 같습니다.잘 끝났고, 약간의 충고를 잡고, 해결을 발견하기 위해 파고 들었다! !! –