2010-01-07 6 views
1

는 SQL 서버 DB 트리거에서 사용할 수있는 데이터를 캐시 어쨌든이 업데이트, 삭제를 보여주는 데이터베이스 트리거가있는 것을 좋아합니다.내가 것</p> <p>, 내가</p> <p>내가 ID, 이름을 가진 사용자 테이블을 가지고 사용자 ID 열이있는 주문 테이블이

그래서 나는 모든 단일 db 트리거에서이 두 테이블 간의 조인을해야만합니다. 나는 사용자에게 ID를 매핑하고 트리거에 "조회"를 다시 사용하는 쿼리를 선행 적으로 수행 할 수 있다면 더 좋을 것이라고 생각합니다. . 이것이 가능한가?

DECLARE @oldId int 
DECLARE @newId int 
DECLARE @oldName VARCHAR(100) 
DECLARE @newName VARCHAR(100) 

SELECT @oldId = (SELECT user_id FROM Deleted) 
SELECT @newId = (SELECT user_id FROM Inserted) 

SELECT @oldName = (SELECT name FROM users where id = @oldId) 
SELECT @newName = (SELECT name FROM users where id = @newId) 

    INSERT INTO History(id, . . . 
+0

한 트랜잭션에서 두 레코드를 업데이트하면 삭제되고 삽입 된 하위 쿼리가 두 레코드를 모두 반환하므로이 트리거가 실패합니다. –

답변

3

좋은 소식은 이미 캐시를 사용하고 있다는 것입니다! SELECT name FROM users WHERE id = @id은 버퍼 풀 캐시 페이지의 이름을 가져옵니다. 날 믿어, 당신은 더 나은 조정, 더 높은 규모와 빠른 캐시를 만들 수 없을 것입니다.

결과 캐싱은 데이터베이스에서 왕복하는 것을 피할 수있는 클라이언트에서 의미가 있습니다. 또는 복잡하고 장기간 실행되는 쿼리 결과를 캐시하는 것이 유용 할 수 있습니다. 그러나 저장된 proc/trigger 내부에는 간단한 인덱스 검색 결과를 캐싱하는 데 아무런 가치가 없습니다.

0

변경 데이터 캡처를 켜고이 코드를 제거하는 방법은 어떻습니까?

편집 나머지를 추가합니다 :

을 사실, 당신은 사용자 이름을 가져올 스칼라 함수의 가능성을 고려하는 경우, 다음하지 않습니다. 절차적인 스칼라 함수 문제 때문에 정말 나 빠졌습니다. 당신은 뭔가 더 나을 것 : user_id를 고유하고 그것이 사용되는 때마다 FK이

INSERT dbo.History (id, ...) 
SELECT i.id, ... 
FROM inserted i 
JOIN deleted d ON d.id = i.id 
JOIN dbo.users u ON u.user_id = i.user_id; 

으로는 큰 문제가되지 않습니다. 하지만 네, 모든 트리거에서이 논리를 반복해야합니다. 논리를 반복하지 않으려면 SQL 2008에서 데이터 캡처 변경을 사용하십시오.

+0

2008 년 기능이 있기 때문에 직접 구현되지 않았습니다. – GrayWizardx

+0

하지만 OP가 버전을 지정하지 않았고 2010 년이며 SP1은 오래전부터 나왔습니다 ... 그래서 희망을 가질 수 있습니까? –