Вопрос о столбцах DateCreated и DateModified - SQL Server

CREATE TABLE Customer
(
        customerID         int identity (500,20) CONSTRAINT 
        .
        .
        dateCreated    datetime DEFAULT GetDate() NOT NULL,
        dateModified   datetime DEFAULT GetDate() NOT NULL
);

Когда я вставляю запись, dateCreated, и dateModified установлен на дату/время по умолчанию. Когда я обновляю/изменяю запись, dateModified, и dateCreated остается, как?Что мне делать?

Очевидно, я должен к значению dateCreated остаться, как был вставлен, первый раз и dateModified продолжают изменяться, когда изменение/модификация происходит в рекордных полях.

Другими словами, можно ли записать демонстрационный быстрый триггер? Я еще не знаю много...

5
задан John Saunders 9 April 2010 в 20:11
поделиться

7 ответов

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

Посмотрите что-нибудь вроде

CREATE TABLE Vals(
        ID INT,
        Val VARCHAR(10),
        DateCreated DATETIME DEFAULT GetDate(),
        DateUpdated DATETIME DEFAULT GetDate()
)
GO

CREATE TRIGGER Upd ON Vals
AFTER UPDATE
AS 
UPDATE Vals
SET     DateUpdated = GetDate()
FROM    Vals INNER JOIN
        inserted ON Vals.ID = inserted.ID
Go

INSERT INTO Vals (ID, Val) SELECT 1, 'A'
SELECT *
FROM    Vals
GO

UPDATE Vals SET Val = 'B'
SELECT *
FROM    Vals
GO

DROP TABLE Vals
GO
10
ответ дан 18 December 2019 в 10:43
поделиться
UPDATE
    Customer
SET
    ... = NewValue,
    dateModified = DEFAULT
WHERE
    ...

Я бы использовал это, а не dateModified = GETDATE () , поэтому GETDATE () используется только один раз (скажем, вы хотите перейти на GETUTCDATE () в будущем)

Или триггер, если вы иметь несколько путей обновления ...?

5
ответ дан 18 December 2019 в 10:43
поделиться

@Kronass, вы понятия не имеете о том, что говорите!

timestamp является синонимом типа данных rowversion и подчиняется поведению синонимов типов данных. В операторах DDL используйте rowversion вместо timestamp везде, где это возможно. Дополнительную информацию см. в разделе Синонимы типов данных (Transact-SQL).

Тип данных timestamp в Transact-SQL отличается от типа данных timestamp, определенного в стандарте ISO.

Синтаксис временных меток является устаревшим. Эта функция будет удалена в одной из будущих версий Microsoft SQL Server. Избегайте использования этой функции в новых разработках и планируйте модификацию приложений, которые в настоящее время используют эту функцию.

rowversion (Transact-SQL) Это тип данных, который отображает автоматически генерируемые уникальные двоичные числа в базе данных. rowversion обычно используется как механизм для маркировки версий строк таблицы. Размер памяти составляет 8 байт. Тип данных rowversion - это просто увеличивающееся число, которое не сохраняет дату или время. Чтобы записать дату или время, используйте тип данных datetime2.

0
ответ дан 18 December 2019 в 10:43
поделиться

В SQL Server есть тип данных под названием timestamp. который отслеживает версию строки для каждого изменения строки. Или, если вы хотите, вы можете использовать триггер и изменить столбец ModifiedDate.

-2
ответ дан 18 December 2019 в 10:43
поделиться

@astander прав, вы должны просто использовать триггер обновления, если хотите, чтобы это было автоматизировано. Мои триггеры обновления немного отличаются (я использую виртуальную таблицу 'inserted'). Вот один из них, который должен соответствовать вашей схеме (переименуйте, как считаете нужным):

CREATE TRIGGER [CustomerDateModifiedTrigger] ON [dbo].[Customer] 
FOR UPDATE
AS
UPDATE Customer
SET dateModified = GETDATE()
FROM Customer c
INNER JOIN inserted i ON c.customerID = i.customerID
0
ответ дан 18 December 2019 в 10:43
поделиться

Когда я вставляю запись, dateCreated и dateModified устанавливаются на дату и время по умолчанию . Когда я обновляю / изменяю запись , dateModified и dateCreated остаются без изменений? Что мне делать?

Значение по умолчанию для столбца используется только при INSERT , а не при UPDATE . Значение по умолчанию будет использоваться командой INSERT, если вы не укажете столбец или введете ключевое слово DEFAULT в INSERT.

INSERT INTO Customer (col1, col2) 
VALUES (..,..)  ---get default for dateCreated & dateModified   

INSERT INTO Customer (col1, col2,dateCreated) 
VALUES (..,..,DEFAULT)  ---get default for dateCreated & dateModified   

INSERT INTO Customer (col1, col2,dateCreated,dateModified) 
VALUES (..,..,DEFAULT,DEFAULT)  ---get default for dateCreated & dateModified   

INSERT INTO Customer (col1, col2,dateCreated,dateModified) 
VALUES (..,..,'1/1/2010',DEFAULT)  ---only get default for dateModified   

INSERT INTO Customer (col1, col2,dateCreated,) 
VALUES (..,..,'1/1/2010')  ---only get default for dateModified   

INSERT INTO Customer (col1, col2,dateCreated,dateModified)
VALUES (..,..,'1/1/2010','1/2/2010')  ---no defaults for dateCreated & dateModifie

Мне нравится использовать локальную переменную, установленную в верхней части процедуры:

DECLARE @RunDate datetime
SET @RunDate=GETDATE()

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

затем используйте:

UPDATE Customer
    SET importantColumn=
       ,dateModified = @RunDate
    WHERE ...

UPDATE CustomerPrice
    SET importantColumn=
       ,dateModified = @RunDate
    WHERE ...
3
ответ дан 18 December 2019 в 10:43
поделиться

1) Обязательно создайте индекс для первичного ключа. (Недавно я обнаружил ошибку такого типа.)

2) Вы можете использовать один триггер INSERT / UPDATE вместо отдельных триггеров ценой небольшой потери эффективности. Если insert.DateCreated имеет значение null, обновите Vals.DateCreated, в противном случае обновите Vals.DateModified.

0
ответ дан 18 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: