0

次の要件があります。

1 つの一意の自動増分 Int ID とデータ列を持つテーブルがあります。次のものが必要です。そのテーブルに行が挿入されるたびに、テーブルの右端の列にその挿入の完全な日時が保持されている必要があります。また、行が更新された場合、その行のテーブルへの挿入の完全な日時を保持する列が必要であり、その行の更新時間を保持するために更新されます。

これを行うための明白で非常に簡単な方法は、次のとおりです。テーブルを作成します。

create table My_Test_Table
(my_id int identity not null,
my_data nvarchar(max));

datetime 列と Default 制約を追加してテーブルを変更します。

ALTER TABLE My_Test_Table
ADD [timestamp] datetime;
ALTER TABLE My_Test_Table
ADD CONSTRAINT DF_My_Test_Table_timestamp DEFAULT GETDATE() FOR [timestamp];

次に、次のように、更新の適切なトリガーを作成します。

CREATE TRIGGER DML_Trigger_update_My_Test_Table
ON My_Test_Table
FOR UPDATE
AS
IF @@ROWCOUNT <> 0
BEGIN
IF EXISTS (SELECT * FROM INSERTED) AND EXISTS (SELECT * FROM DELETED)
BEGIN
UPDATE My_Test_Table
SET [timestamp] = GETDATE()
FROM INSERTED
WHERE My_Test_Table.my_id = INSERTED.my_id;
END
END

ここで難しいのは、ここでの範囲を超えた理由により、上記とまったく同じことをトリガーなしで実装したいということです! 出来ますか?私はSQLタイプのタイムスタンプまたは行バージョンを使用したくありません。これはうまくいきません。その列に明確に保存するには、ミリ秒までの日付と時間を必要とします。どんなアイデアでも大歓迎です。

4

1 に答える 1

4

トリガーはいらない

UPDATE ステートメントのソース値として DEFAULT キーワードを使用して、その列に定義された DEFAULT 制約を使用できます。

UPDATE
   MyTable
SET
   foo = ...,
   bar = ...,
   ChangedDateTime = DEFAULT
WHERE
   ...;

という名前の列は使用しませんtimestamp。これは、SQL Server で意味を持つため、rowversion . SQL Server 2008+ ではdatetime2(3)、ミリ秒を正確に記録するために使用します。「古い」datetimeは丸められた 3.33 ミリ秒まで正確です

于 2013-05-22T10:03:44.017 に答える