DateCreated столбец в сервере Sql? - PullRequest
6 голосов
/ 17 февраля 2009

Существует ли специальный способ объявления столбца DateCreated в таблице MS Sql Server, чтобы он автоматически заполнял его соответствующей отметкой времени при создании?

Или .. нужно ли указывать дату и время при выполнении запроса вручную?

Ответы [ 4 ]

16 голосов
/ 17 февраля 2009

Значения по умолчанию имеют два основных недостатка.

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

Это означает, что вы не можете быть уверены, что значения не были изменены вне вашего контроля.

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

Триггер вставки для установки столбца на текущую дату и триггер обновления для предотвращения изменения этого столбца (или, точнее, установки его текущего значения) являются способом реализации столбца DateCreated.

Триггер вставки и обновления для установки столбца на текущую дату является способом реализации столбца DateModified.

(редактирование от пользователя Габриэль - вот моя попытка реализовать это, как описано - я не уверен на 100%, что это правильно, но я надеюсь, что ОП проверяет это ...):

CREATE TRIGGER [dbo].[tr_Affiliate_IU] 
   ON  [dbo].[Affiliate] 
   AFTER INSERT, UPDATE
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Get the current date.
    DECLARE @getDate DATETIME = GETDATE()

    -- Set the initial values of date_created and date_modified.
    UPDATE
        dbo.Affiliate
    SET 
         date_created = @getDate
    FROM
        dbo.Affiliate A 
        INNER JOIN INSERTED I ON A.id = I.id
        LEFT OUTER JOIN DELETED D ON I.id = D.id
    WHERE
        D.id IS NULL

    -- Ensure the value of date_created does never changes.
    -- Update the value of date_modified to the current date.
    UPDATE
        dbo.Affiliate
    SET
         date_created = D.date_created
        ,date_modified = @getDate
    FROM 
        dbo.Affiliate A 
        INNER JOIN INSERTED I ON A.id = I.id
        INNER JOIN DELETED D ON I.id = D.id 
END
10 голосов
/ 17 февраля 2009

Вы можете установить значение столбца по умолчанию "getdate ()"

2 голосов
/ 17 февраля 2009

У нас есть DEFAULT для CreatedDate и мы не применяем триггеры

Бывают случаи, когда мы хотим установить дату явно - например, если мы импортируем данные из какого-либо другого источника.

Существует риск того, что ошибка приложения может привести к путанице с CreateDate или недовольным администратором баз данных в этом отношении (у нас нет не администраторов баз данных, подключающихся напрямую к нашим базам данных)

Полагаю, вы можете установить разрешения на уровне столбца для CreateDate.

На полпути может быть, что INSERT TRIGGER создаст строку в таблице 1: 1, чтобы столбец находился за пределами основной таблицы. Вторая таблица может иметь разрешения SELECT, где основная таблица имеет разрешения UPDATE, и, таким образом, не требуется триггер UPDATE для предотвращения изменений в CreateDate, что устранит некоторый «вес» при обычном обновлении строк.

Полагаю, у вас может быть триггер UPDATE / DELETE на второй таблице, чтобы предотвратить изменение (которое никогда не будет выполнено в нормальных условиях, поэтому "облегченное")

Немного неприятно иметь дополнительную таблицу, хотя ... может быть одна таблица для всех CreateDates - TableName, PK, CreateDate. Большинство архитекторов баз данных будут ненавидеть это, хотя ...

1 голос
/ 17 февраля 2009

Конечно, есть.

Вот вам пример в действии.

Create table #TableName
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    CreatedDate DATETIME NOT NULL DEFAULT GETDATE(),
    SomeDate VARCHAR(100)
)

INSERT INTO #TableName (SomeDate)
SELECT 'Some data one' UNION ALL SELECT 'some data two' 

SELECT * FROM #TableName 

DROP TABLE #TableName 
...