2011-05-13 4 views
0

테이블 "TRANSACTION"에 대한 트리거를 쓰고 싶습니다. 새 라인이 삽입 될 때 "TRANSACTIONID"필드를 트리거하여 모든 이전 레코드의 최대 값 +1로 트리거하려고합니다.트리거를 작성해야합니다

SQL에 대해 많이 알지 못합니다. 누군가 나를 도울 수 있습니까? 이 테이블에 삽입에는 직렬화하므로

많은 감사

+0

이 작업의 IDENTITY 열을 고려 했습니까? 일반적으로이 작업을 위해 더 나은 접근 방법으로 간주됩니다. http://msdn.microsoft.com/en-us/library/ms186775.aspx를 참조하십시오. –

+0

답장을 보내 주셔서 감사합니다. 나는 자동 증분 컬럼을 원하지 않는다. 이 방아쇠가 필요합니다. 도울 수 있니? – Kevin

+0

어떤 SQL 버전을 사용하고 있습니까? 미시시피 SQL 서버, 오라클, MySQL은, 등? –

답변

6

이것은, 다중 사용자 환경을위한 정말 좋은 생각입니다. , 당신은 "돌연변이 테이블을 피하기 위해 복잡한 3 트리거 솔루션을 쓸 필요가 실제로 최대 전류 값에 1을 더한있어 트리거 기반 솔루션을 작성하려면

create sequence transaction_seq; 

create trigger transaction_bir before insert on transaction 
for each row 
begin 
    :new.id := transaction_seq.nextval; 
end; 

: 일반적인 접근 방식은 오라클 시퀀스를 사용하는 것입니다 "문제. 또는 당신은이 같은 현재의 최대 값을 유지하기 위해 다른 테이블을 사용하여 간단한 솔루션을 만들 수 있습니다

create table transaction_max (current_max_id number); 

insert into transaction_max values (0); 

create trigger transaction_bir before insert on transaction 
for each row 
declare 
    l_current_max_id number; 
begin 
    update transaction_max set current_max_id = current_max_id + 1 
     returning current_max_id into l_current_max_id; 
    :new.id := l_current_max_id; 
end; 

이쪽 돌연변이 테이블 문제를 방지하고 삽입 (느리게) 직렬화됩니다, 그래서 어떤 이점을 볼 수 없습니다 이것의 순서를 사용하여.

+0

. 이것은 나를 위해 작동 :) – Kevin

0
CREATE TRIGGER trigger1 on TransactionTable 
INSTEAD OF INSERT 
AS 
BEGIN 

    DECLARE @MaxTranId INT 

    SELECT 
     @MaxTranId = MAX(TransactionId) 
    FROM 
     TransactionTable 

    INSERT INTO TransactionTable 
     SELECT 
      @MaxTranId + 1 , 
      RestOfYourInsertedColumnsHere , 
     FROM 
     inserted 
END 
GO 
+1

이 답변은 일부 DBMS에는 맞지만 Oracle에는 맞지 않을 수 있습니다. –

+0

이것은 동시성에 안전하지 않습니다. 덕분에 –

관련 문제