Столбец даты создания в таблице SQL - PullRequest
1 голос
/ 29 апреля 2010

Какой самый простой способ автоматически заполнить столбец datetime в таблице данных SQL датой создания строки? Использование SQL Server 2005, если это имеет значение.

РЕДАКТИРОВАТЬ: я пытался использовать GETDATE () по умолчанию, и это работает для запроса INSERT, но не когда TableAdapter добавляет строку.

Ответы [ 6 ]

5 голосов
/ 29 апреля 2010
ALTER TABLE table
ADD column NOT NULL DEFAULT (GETDATE())
2 голосов
/ 29 апреля 2010

Вы должны создать столбец и иметь:

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

Любое решение со значением по умолчанию небезопасно, поскольку его можно обойти путем специальной настройки столбца при вставке или последующем изменении столбца. Решение на основе триггера помещает управление в СУБД, где оно принадлежит.

1 голос
/ 29 апреля 2010

Как видите, у вас впереди несколько решений. Короче,

  1. Вы можете написать свой метод (из VBNET), который устанавливает в соответствующем поле значение System.DateTime.Now (не рекомендуется);

    Public Function InsertObject(o As Object) As Integer
        cmd.CommandText = String.Format("INSERT INTO table_name (Id, CreationDate) VALUES (1, {0})", System.DateTime.Now)
        Return cmd.ExecuteNonQuery()
    End Function
    
  2. Вы можете написать триггер INSTEAD OF INSERT и заменить вставленное значение CreationDate на GETDATE () (рекомендуемый способ);

    CREATE TRIGGER trg_bi_PersistObject
    ON objectToPersistTable
    INSTEAD OF INSERT AS
        insert into objectToPersistTable (Id, CreationDate) (
            select Id, GETDATE()
                from inserted
        )
    

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

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

    (См. Код Дэвида М. или К.М.).

Как указано в комментарии paxdiablo к его собственному ответу, такая функция должна обрабатываться на стороне СУБД во избежание повреждения данных на стороне клиента приложения. Тогда я уверен, что ваш лучший выбор может быть 2. создание триггера BEFORE INSERT и установка значения с помощью функции GETDATE ().

1 голос
/ 29 апреля 2010

установить для него значение по умолчанию:

CREATE TABLE dbo.YourTable
    (
    columns....,
    YourDateTime datetime NOT NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.YourTable ADD CONSTRAINT
    DF_YourTable_YourDateTime DEFAULT GETDATE() FOR YourDateTime

когда вы ВСТАВЛЯЕТЕ, не перечисляйте этот столбец:

INSERT INTO dbo.YourTable (columns...) VALUES (values...)

или когда вы ВСТАВЛЯЕТЕ этот столбец, но используете ключевое слово DEFAULT:

INSERT INTO dbo.YourTable (columns...,YourDateTime) VALUES (values...,DEFAULT)

или когда вы ВСТАВЛЯЕТЕ в этот столбец и используете GETDATE () или какой-либо другой datetime:

INSERT INTO dbo.YourTable (columns...,YourDateTime) VALUES (values...,'1/1/2010 12:34:56')
1 голос
/ 29 апреля 2010

используйте функцию getdate(),

так что-то вроде: insert data1, data2, getdate() into table1

0 голосов
/ 29 апреля 2010

Будьте осторожны, если вы используете репликацию.Я не знаком с внутренними подробностями репликации SQL Server, но я знаю, что при некоторых формах репликации MySQL, если вы используете NOW () в качестве значения по умолчанию или используете триггер, использующий одну и ту же функцию, даты будут различаться междубазы данных издателя и подписчика.

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

Если вы используетерепликации, вы можете проверить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...