Вместо триггера для обновления первичного ключа - PullRequest
2 голосов
/ 14 июля 2010

Долгое время читатель, первый постер; -)

Я внедряю систему, основанную на старой системе.Новая система использует SQL Server 2008, и моя проблема возникает при попытке вставить новые элементы в основную таблицу.Это произойдет двумя способами: он может быть импортирован из существующей системы (1) или может быть создан в новой системе (2).

В случае (1) элемент уже имеет идентификатор (int)который я хотел бы сохранить.В случае (2) идентификатор не будет заполнен, и я хотел бы сгенерировать идентификатор, который равен +1 от максимального текущего значения в таблице.Это, конечно, должно работать и для вставки нескольких строк.

Насколько я вижу, решение будет заключаться в создании INSTEAD OF TRIGGER, но я не могу понять, как это сделать.Кто-нибудь может дать мне подсказку или указать мне, как это можно сделать?

Крис

Ответы [ 3 ]

1 голос
/ 14 июля 2010

По вашему запросу на использование триггера INSTEAD OF этот код SQL может помочь вам начать работу.

CREATE TABLE dbo.SampleTable
(
    ID INT,
    SomeOtherValue VARCHAR(100) NULL
)
GO

CREATE TRIGGER dbo.TR_SampleTable_Insert
   ON  dbo.SampleTable
   INSTEAD OF INSERT
AS 
BEGIN

    SET NOCOUNT ON;

    -- Inserting rows with IDs
    INSERT INTO dbo.SampleTable (
        ID, 
        SomeOtherValue)
    SELECT 
        ID, 
        SomeOtherValue
    FROM
        Inserted    
    WHERE
        ID IS NOT NULL

    -- Now inserting rows without IDs
    INSERT INTO dbo.SampleTable (
        ID, 
        SomeOtherValue)
    SELECT 
        (SELECT ISNULL(MAX(ID), 0) FROM dbo.SampleTable) 
            + ROW_NUMBER() OVER(ORDER BY ID DESC),
        SomeOtherValue
    FROM
        Inserted
    WHERE
        ID IS NULL

END
GO

INSERT INTO dbo.SampleTable
SELECT 1, 'First record with id'
UNION
SELECT NULL, 'First record without id'
UNION
SELECT 2, 'Second record with id'
UNION
SELECT NULL, 'Second record without id'
GO

SELECT * FROM dbo.SampleTable
GO
1 голос
/ 14 июля 2010

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

Я бы предостерег, что если вставляются старые и новые записи, смешиваются и совпадают, ваш сценарий, вероятно, потерпит неудачу, поскольку новые записи будут получать старые идентификаторы до того, как будут вставлены старые записи. Я рекомендую получить максимальный идентификатор старой таблицы прямо сейчас, а в хранимой процедуре установить новый первичный ключ равным значению Greater (старый максимум + 1, текущая таблица максимум)

0 голосов
/ 14 июля 2010

Другие показали, как написать такой триггер.

Другой и часто рекомендуемый подход заключается в сохранении обоих идентификаторов в новой базе данных. Каждая запись получает новый идентификатор в новой системе (по столбцу IDENTITY или другим способом). Кроме того, если запись импортируется из другой системы, она ассоциируется с OriginSystem и OriginID. Таким образом, вы можете сохранить старые идентификаторы для справки. Этот подход имеет дополнительное преимущество, заключающееся в возможности поддержки новой системы для импорта данных, например, из при слиянии или обмене данными с другой системой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...