7

作成時に適切なタイムスタンプが自動的に入力されるように、MS Sql Server テーブルで DateCreated 列を宣言する特別な方法はありますか?

または..手動でクエリを実行するときに日時を提供する必要がありますか?

4

5 に答える 5

18

デフォルト値には、2 つの大きな欠点があります。

  • 挿入ステートメントが列の値を指定する場合、デフォルトは使用されません。
  • 列はいつでも更新できます。

これらは、値が制御外で変更されていないことを確認できないことを意味します。

真のデータ整合性が必要な場合 (行の日付が作成日であることを確認するため)、トリガーを使用する必要があります。

列を現在の日付に設定するための挿入トリガーと、その列への変更を防止する (より正確には、現在の値に設定する) ための更新トリガーは、DateCreated 列を実装する方法です。

列を現在の日付に設定する挿入および更新トリガーは、DateModified 列を実装する方法です。

(ユーザーGabrielからの編集-説明どおりにこれを実装しようとする私の試みです-100%正しいとは確信していませんが、OPがそれをレビューすることを望んでいます...):

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
于 2009-02-17T05:10:36.980 に答える
11

列のデフォルト値を「getdate()」に設定できます

于 2009-02-17T04:59:20.953 に答える
2

CreatedDate に DEFAULT があり、トリガーを強制しません

日付を明示的に設定したい場合があります。たとえば、他のソースからデータをインポートする場合などです。

アプリケーションのバグが CreateDate を混乱させたり、DBA に不満を抱かせたりするリスクがあります (DBA 以外のユーザーが DB に直接接続することはありません)。

CreateDate に列レベルのアクセス許可を設定する可能性があると思います。

中途半端な方法としては、INSERT TRIGGER で 1:1 テーブルに行を作成し、その列がメイン テーブルの外にあるようにすることです。2 番目のテーブルには SELECT 権限があり、メイン テーブルには UPDATE 権限があるため、CreateDate への変更を防ぐための UPDATE トリガーは必要ありません。これにより、行を正常に更新するときに「重み」がいくらか取り除かれます。

変更を防ぐために、2番目のテーブルにUPDATE/DELETEトリガーを設定できると思います(通常の状況では決して実行されないため、「軽量」です)。

ただし、余分なテーブルを持つのは少し面倒です...すべてのCreateDatesに対して1つのテーブルを持つことができます-TableName、PK、CreateDate。ほとんどのデータベース アーキテクトはそれを嫌うでしょう...

于 2009-02-17T11:31:26.330 に答える