2012-12-21 9 views
3

사용자가 테이블에 데이터를 삽입 할 때 테이블 필드의 특정 문자를 업데이트하는 데이터베이스 트리거를 만들려고합니다 ... Ex.삽입 트리거가 제대로 작동하지 않습니다.

ID EXCHANGE LEADRT 
1 new   L-3 
2 new   3 
3 new   5 

그래서 LEADRT의 형식이 올바르지 만 IDS 2와 3이 아니기 때문에 혼자 ID 1를 마칠 것이다.

CREATE TRIGGER triggerupdate ON PoleUnits FOR INSERT, 
UPDATE AS 
if not exists (select * from Poleunits where LEADRT like '%L-%') 
update PoleUnits set LEADRT = STUFF (LEADRT, 1, 0,'L-'); 

왜 내가이 작업을 수행 할 수 없는지 또는 더 좋은 방법에 대한 제안은 무엇입니까?

+2

해당 SQL/RDBM의 특징을 표시하십시오. – Andrew

+0

당신은 무엇을해야합니까? LEADRT 칼럼을'L-3'과'L-5'로 업데이트 하시겠습니까? – Justin

+0

SQL Management Studio 2012를 사용하고 있습니다. LEADRT 필드에 3이 올바르게 채워지지 않으면 트리거가 LEADRT 필드를 업데이트하고 'L-'을 삽입하여 데이터가 L-3처럼 보이게합니다. – ghoston3rd

답변

3

삽입 및 업데이트 트리거에서 삽입/업데이트 할 행이있는 inserted이라는 특정 테이블에 액세스 할 수 있습니다. 이들은 실제 테이블이 아니며 트리거가 발생한 테이블과 동일한 구조의 논리적 테이블 일뿐입니다.

현재 논리는 원본 테이블에서 작동하므로 실제로 삽입하는 데이터가 아닌 기존의 모든 데이터로 작업합니다. 즉, 실제로 업데이트하려는 데이터를 제외한 모든 데이터가 업데이트됩니다. 이 같은 뭔가 일할 수 :

CREATE TRIGGER triggerupdate ON PoleUnits 
FOR INSERT, UPDATE AS 
    update PoleUnits 
    set LEADRT = STUFF (PoleUnits.LEADRT, 1, 0,'L-') 
    from PoleUnits 
    inner join inserted -- this is basically a self join 
     on PoleUnits.ID = inserted.ID 
    where PoleUnits.LEADRT not like '%L-%' 

에만 삽입되고 PoleUnits에서 해당 행을 업데이트하고, 자신의 LEADRT 필드는 L- 형식이 아닌 경우에만 가능합니다.

+0

다음을 받았습니다. 메시지 286, 수준 16, 상태 1, 프로 시저 triggerupdate, 3 행 논리 테이블 INSERTED 및 DELETED는 업데이트 할 수 없습니다. – ghoston3rd

+0

실제로 자동으로 입력했습니다. 대답을 편집합니다 – SWeko

+0

자, 이제 알겠습니다. 메시지 156, 수준 15, 상태 1, 프로 시저 triggerupdate, 5 줄 'from'키워드 근처에 구문이 잘못되었습니다. – ghoston3rd

관련 문제