2010-04-09 3 views
4
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 Columns - SQL Server

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

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

+2

В ваших запросах обновления, почему бы вам просто не сбросить dateModified = GetDate()? – Aaron

+1

Я хочу сделать его автоматическим ... – user311509

ответ

9

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

Посмотрите на что-то вроде

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 
+1

не лучше ли использовать INSERTED, а не DELETED, если ваше обновление изменяет PK (это действительно плохо), это не сработает, или я что-то упустил? –

+0

Правда, я думаю, что это кажется правильным, изменит его сейчас. –

-2

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

+4

TimeSpan? В SQL Server ??? В самом деле?!?!?? Я думаю, что в .NET Framework есть TimeSpan - но, конечно, ** не ** в SQL Server - по крайней мере, нет версии SQL Server, которую я знаю ... –

+0

Crap i Положите неправильное слово вместо метки времени, я ошибочно поменяю время. – Kronass

4
UPDATE 
    Customer 
SET 
    ... = NewValue, 
    dateModified = DEFAULT 
WHERE 
    ... 

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

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

+0

, если вам действительно нужно, поиск и замена будут работать довольно хорошо на чем-то вроде 'GETDATE' –

3

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

A Столбец по умолчанию используется только тогда, когда INSERT ing, а не 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 разрешал null и не имел значения по умолчанию, когда он вставлен, он был создан не изменен, я установлю dateModified, когда он будет фактически изменен.

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

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

UPDATE CustomerPrice 
    SET importantColumn= 
     ,dateModified = @RunDate 
    WHERE ... 
0

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

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

@Kronass, вы не имеете ни малейшего представления о том, что uou говорят!

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

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

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

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

0

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

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

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