нужно написать триггер - PullRequest
0 голосов
/ 13 мая 2011

Я хочу написать триггер для таблицы «TRANSACTION». Когда вставляется новая строка, я хочу, чтобы триггер обновил поле «TRANSACTIONID» до максимального значения + 1 из всех предыдущих записей.

Я мало что знаю о SQL. Кто-нибудь может мне помочь?

большое спасибо

Ответы [ 2 ]

6 голосов
/ 13 мая 2011

Это действительно плохая идея для многопользовательской среды, поскольку она будет сериализовать вставки в таблицу.Обычный подход заключается в использовании последовательности Oracle:

create sequence transaction_seq;

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

Чтобы написать решение на основе триггера, которое на самом деле получило максимальное значение тока плюс 1, вам необходимо написать сложное решение с 3-триггерами, чтобы избежать "мутирующий стол "вопрос.Или вы можете создать более простое решение, используя другую таблицу для хранения текущего максимального значения, например:

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 голосов
/ 13 мая 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...