Как сохранить значения версии строк в таблице, в которой уже есть столбец версий строк?

У меня есть две таблицы (Users, DeletedUsers) и триггер Users_Delete, Когда удаляется запись пользователя, я хочу сохранить идентификатор и последний rowversion значение (до того, как оно было удалено) в DeletedUsers Таблица.

Потому что SQL не позволяет несколько столбцов типа rowversion на столе, как я должен хранить LastUserVersion в DeletedUsers Таблица? Какой тип данных я должен использовать?

Образец кода:

CREATE TABLE [dbo].[Users] (
    [ID] [uniqueidentifier] NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [Version] [rowversion] NOT NULL
)

CREATE TABLE [dbo].[DeletedUsers] (
    [ID] [uniqueidentifier] NOT NULL,
    [LastUserVersion] [rowversion] NOT NULL,    -- ERROR
    [Version] [rowversion] NOT NULL
)

CREATE TRIGGER [dbo].[Users_Delete] ON [dbo].[Users]
    AFTER DELETE
    AS
    BEGIN
    SET NOCOUNT ON

    INSERT INTO [dbo].[DeletedUsers]
    (
        ObjectID,
        LastUserVersion
    )
    SELECT
        ObjectID,
        Version
    FROM DELETED
    SET NOCOUNT OFF
    END

2 ответа

Решение

Как сохранить значения версии строк в таблице, в которой уже есть столбец версий строк?

По данным MSDN:

Необнуляемый столбец обращения строк семантически эквивалентен двоичному столбцу (8). Обнуляемый столбец версии строки семантически эквивалентен столбцу varbinary(8).

Потому что определение [rowversion] столбец [Version] [rowversion] NOT NULL вы могли бы использовать BINARY(8),

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

Тем не менее, rowversion это Binary(8), так что вы можете использовать это. По сути, это число, поэтому вы можете преобразовать его в целое число, которое может быть более удобным. Для 8 байт вам понадобится bigint.

Другие вопросы по тегам