作成時に適切なタイムスタンプが自動的に入力されるように、MS Sql Server テーブルで DateCreated 列を宣言する特別な方法はありますか?
または..手動でクエリを実行するときに日時を提供する必要がありますか?
作成時に適切なタイムスタンプが自動的に入力されるように、MS Sql Server テーブルで DateCreated 列を宣言する特別な方法はありますか?
または..手動でクエリを実行するときに日時を提供する必要がありますか?
デフォルト値には、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
列のデフォルト値を「getdate()」に設定できます
CreatedDate に DEFAULT があり、トリガーを強制しません
日付を明示的に設定したい場合があります。たとえば、他のソースからデータをインポートする場合などです。
アプリケーションのバグが CreateDate を混乱させたり、DBA に不満を抱かせたりするリスクがあります (DBA 以外のユーザーが DB に直接接続することはありません)。
CreateDate に列レベルのアクセス許可を設定する可能性があると思います。
中途半端な方法としては、INSERT TRIGGER で 1:1 テーブルに行を作成し、その列がメイン テーブルの外にあるようにすることです。2 番目のテーブルには SELECT 権限があり、メイン テーブルには UPDATE 権限があるため、CreateDate への変更を防ぐための UPDATE トリガーは必要ありません。これにより、行を正常に更新するときに「重み」がいくらか取り除かれます。
変更を防ぐために、2番目のテーブルにUPDATE/DELETEトリガーを設定できると思います(通常の状況では決して実行されないため、「軽量」です)。
ただし、余分なテーブルを持つのは少し面倒です...すべてのCreateDatesに対して1つのテーブルを持つことができます-TableName、PK、CreateDate。ほとんどのデータベース アーキテクトはそれを嫌うでしょう...