2015-06-03 5 views
2

Я конвертирую базу данных Firebird в MS SQl Server. Поскольку есть несколько приложений, обращающихся к базе данных, я действительно хочу, чтобы MS SQL Server действовал как можно проще, как в базе данных Firebird.Триггер Firebird, переведенный на MS SQL Server

В Firebird он объявлен как

CREATE TRIGGER CUSTOMER_BI FOR CUSTOMER 
ACTIVE BEFORE INSERT POSITION 0 
as 
begin 
    if (new.cust_id is null) then 
    new.cust_id = gen_id(gen_cust_id,1); 
end 

Так у меня есть последовательность (генератор в FB) называется gen_cust_id и моя главная цель состоит в том, чтобы заполнить поле cust_id с nextvalue из последовательности.

Я очень хорошо знаю, что SQL Server предлагает мне поле autoinc. На самом деле это не то, что я ищу здесь, поскольку приложения (приложения) для внешнего интерфейса делают это различными способами. Некоторые из них сначала получают порядковый номер и могут или не могут совершать запись. В этом случае я просто отбрасываю сгенерированный порядковый номер.

Любая помощь очень ценится. Заранее спасибо

+0

Я понимаю, что я только ответил часть вашего вопроса. Что означает «ПОЗИЦИЯ 0» в синтаксисе firebird? Это похоже на триггер SQL, за исключением этой части. – CDC

+0

Позиция @CCC (что необязательно) определяет порядок выполнения, если у вас есть несколько триггеров. –

ответ

2

Поскольку последовательность ANSI не была реализована до SQL 2012, вы должны ознакомиться с этой статьей. Я использовал эти предложения, чтобы использовать последовательности в SQL 2005 - 2008 на некоторое время с отличными результатами.

http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server-sequence-number.aspx

Таким образом, используя вариант 2 (мой предпочтительный), вы можете иметь триггер, глядя, как показано ниже.

Примечание: это работает только с одной строкой. Если вам нужно больше 1, вам нужно изменить код примера в ссылке, чтобы дать вам диапазоны и сделать комплексное решение для обращения к каждой строке нулевого идентификатора во вставленной «таблице».

CREATE TRIGGER dbo.CUSTOMER_BI 
    ON dbo.CUSTOMER INSTEAD OF INSERT 
AS 
BEGIN 
    DECLARE @sequence_id INT; 

    IF EXISTS(SELECT * FROM INSERTED WHERE cust_id IS NULL) 
    BEGIN 
     EXEC @sequence_id = dbo.GetNewSeqVal_Customer; 
    END 
    INSERT INTO CUSTOMER 
    (
     cust_id, 
     <col list> 
    ) 
    SELECT 
     ISNULL(cust_id, @sequence_id), 
     <col list> 
    FROM INSERTED; 
END 
+0

Вы не учли бит 'POSITION 0'. Согласно [this] (http://www.firebirdsql.org/refdocs/langrefupd21-ddl-trigger.html), это означает порядок, в котором запускается триггер. SQL Server не полностью поддерживает это, но он позволяет вам указать первый и последний триггер. –

+0

@AndriyM Я бы предположил, что «позиция 0», вероятно, не имеет значения (каждый триггер имеет позицию, даже если для таблицы или представления есть только одна). Параметр необязателен при определении триггера; большинство инструментов включают его, когда вы просите их показать DDL. –

-1

позиция 0 имеет значение только, если есть более чем один триггер на столе, и если есть MSSQL сторона может объединить их в 1

+0

Вы имели в виду это как ответ на мой комментарий? Если это так, вы не должны были бы размещать это как ответ. –

Смежные вопросы