2010-06-30 6 views
2

삽입, 업데이트 및 삭제 된 행을 감사하는 데 사용되는 트리거가 있습니다. 트리거에서 이전 값과 새 값을 얻는 데 문제가 있습니다. 트리거는 루프를 사용하여 어떤 방식 으로든 변경 (삽입, 업데이트, 삭제) 된 행의 모든 ​​값을 삽입합니다. 그러나, 내 코드 값 대신 값으로 열 이름을 반환하지 않습니다.SQL 업데이트/삭제 트리거가 제대로 작동하지 않습니다.

SELECT @COLNAME = NAME 
FROM SYSCOLUMNS 
WHERE COLID = @FIELD AND 
    ID = (SELECT ID FROM SYSOBJECTS WHERE NAME = 'FIN_HOTEL_DTL_TYPE') 
SELECT @OLDVAL = SUBSTRING(@COLNAME, 2, LEN(@COLNAME)) FROM DELETED 
SELECT @NEWVAL = SUBSTRING(@COLNAME, 2, LEN(@COLNAME)) FROM INSERTED 
SELECT @MODBY = MODIFIED_BY FROM INSERTED 
SELECT @MODDT = MODIFIED_DATETIME FROM INSERTED 

답변

3

T-SQL 그냥 다른 세계입니다 : 여기

내 코드의 일부입니다.

귀하의 코드는 귀하가 말한 것과 정확히 일치합니다. @ColName은 열 객체에 대한 참조가 아니며 열의 이름으로로드 한 문자열 값을 보유하는 변수입니다.

example을 제안합니다. 원하는 경우 전체 내용을 읽으십시오. 그러나 서둘러야 할 경우 CREATE TRIGGER Audit 문구로 내려갑니다.

또한 예제에서와 같이 설정 기반 논리를 사용하여이 작업을 수행하십시오. T-SQL을 사용하고 행 단위 코딩의 결합을 풀어 DBMS의 성능과 성능을 활용하십시오. 정말로. 코딩 된 루프 = 성능 저하. 필요한 경우 DBMS는 백그라운드에서 루프를 구현합니다 (또는 원하는 경우).

행운을 빈다.


이전에이 링크를 찾으려고했습니다. 나는 Paul Nielsen의 this posting이 당신이 원하는 것과 아주 가깝다고 믿습니다.

+0

그래, 나는 @ColName에 대해 많이 생각했다. 테이블의 일부가 광범위한 컬럼 (레거시 DB, 안타깝게도 내 선택이 아닌)을 가지고 있고 각 컬럼을 코드화하고 싶지 않기 때문에이 유형의 로직을 사용하고있었습니다. – mattgcon

+0

아름다운 대답, 특히 루프에서이 작업을 피하는 것에 관한 부분. 유사한 트리거를 구현했으며 성능이 뛰어나고 루프가 없으면 더 짧고 간단합니다. – TimothyAWiseman

+0

도움 주셔서 감사합니다. 루프를 꺼내 단순히 열을 개별적으로 참조했습니다. – mattgcon

관련 문제