какой тип в SQL Server использовать как метку времени для записи? - PullRequest
4 голосов
/ 17 февраля 2010

У меня есть таблица в SQL Server, tblMain. Есть триггер, который при изменении строки в основном выполняет SELECT * из tblMain и вставляет измененную строку в tblHistory. tblHistory является дубликатом tblMain (только намного выше) и имеет одно дополнительное поле для уникального идентификатора. Недавно я добавил поле типа TimeStamp (которое, как я теперь понимаю, устарело, но я рассмотрю это позже), чтобы избежать проблемы конфликта записи в Microsoft Access 2007.

Очевидно, что триггер копирует каждое поле в tblMain в tblHistory. Это делает Select *. Однако, если я добавлю поле типа timeStamp в таблицу истории, чтобы получить поле из tblMain, триггер, очевидно, завершится неудачно. Какой тип я должен использовать в таблице истории, чтобы принять источник TimeStamp?

Ответы [ 3 ]

5 голосов
/ 17 февраля 2010

Из документов:

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

Это работает:

-- //Main table, with TIMESTAMP column
CREATE TABLE Main ( id INT, TIMESTAMP )

-- //Some values
INSERT Main VALUES ( 8, DEFAULT )
INSERT Main VALUES ( 4, DEFAULT )
INSERT Main VALUES ( 2, DEFAULT )
INSERT Main VALUES ( 7, DEFAULT )
INSERT Main VALUES ( 0, DEFAULT )

-- //See the values
SELECT * FROM Main

-- //History table
-- //with VARBINARY(8) to store a nullable TIMESTAMP
CREATE TABLE History (id INT, ts VARBINARY(8))

-- //Populate History table
INSERT History
SELECT * FROM Main

-- //See the values
SELECT * FROM History
3 голосов
/ 17 февраля 2010

Тип столбца TIMESTAMP переименовывается, в основном, с SQL Server 2008 и выше, он будет называться ROWVERSION - он не исчезнет, ​​просто получил новое имя.

Теперь столбцы TIMESTAMP действительно недоступны для записи - поэтому, по сути, в вашем триггере необходимо выполнить инструкцию INSERT, в которой перечислены все столбцы, которые вы хотите записать, и пропустить TIMESTAMP.

TIMESTAMP / ROWVERSION - ваша лучшая ставка - гарантируется, что только этот тип столбца всегда будет уникальным и всегда будет увеличиваться для каждой последующей вставки. Любой из столбцов, связанных с DATE, может иметь дубликаты (в SQL Server 2005 DATETIME имеет точность 3,33 мс, поэтому вы обязательно можете иметь дубликаты).

Возможно, вы захотите использовать комбинацию TIMESTAMP для точности и уникальности и DATETIME для удобочитаемости. TIMESTAMP обрабатывается SQL Server автоматически, для LastModifiedDate DATETIME вы можете определить DEFAULT CONSTRAINT из GETDATE(), чтобы для каждой вставки записывалась текущая дата / время.

0 голосов
/ 17 февраля 2010

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

INSERT INTO tblHistory
        (col1, col2, ...)
    SELECT
        col1, col2, ...
        FROM INSERTED
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...