13

テーブルを定義しました(以下のコードスニペットを参照)。行が変更されるたびにLastUpdate列が自動的に更新されるように、制約などを追加するにはどうすればよいですか?

CREATE TABLE dbo.Profiles
(
        UserName                                varchar(100)            NOT NULL,
        LastUpdate                              datetime                NOT NULL  CONSTRAINT DF_Profiles_LastUpdate DEFAULT (getdate()),
        FullName                                varchar(50)             NOT NULL,
        Birthdate                               smalldatetime           NULL,
        PageSize                                int                     NOT NULL CONSTRAINT DF_Profiles_PageSize DEFAULT ((10)),
        CONSTRAINT PK_Profiles PRIMARY KEY CLUSTERED (UserName ASC),
        CONSTRAINT FK_Profils_Users FOREIGN KEY (UserName) REFERENCES dbo.Users (UserName) ON UPDATE CASCADE ON DELETE CASCADE  
)
4

5 に答える 5

24

私は他の人に同意します - LastUpdate 列に GetDate() のデフォルト値を設定し、トリガーを使用して更新を処理します。

次のような単純なもの:

CREATE TRIGGER KeepUpdated on Profiles
FOR UPDATE, INSERT AS 
UPDATE dbo.Profiles 
SET LastUpdate = GetDate()
WHERE Username IN (SELECT Username FROM inserted)

本当に凝ったものにしたい場合は、変更されているものとデータベースにあるものを評価し、違いがあった場合にのみ LastUpdate を変更します。

このことを考慮...

  • 午前 7 時- ユーザー「jsmith」が姓「Smithe」で作成されます (おっと)、LastUpdate のデフォルトは午前 7 時です

  • 午前 8 時- 'jsmith' が IT に電子メールを送り、彼の名前が間違っていると伝えました。すぐに更新を実行すると、姓は「Smith」になり、(トリガーのおかげで) LastUpdate は午前 8 時を示します

  • 午後 2 時- 怠け者の同僚がついに StumbleUpon に飽きて、メールをチェックします。彼は、名前の変更に関する「jsmith」からの以前のメッセージを確認します。彼は次のように実行します。UPDATE Profiles SET LastName='Smith' WHERE Username='jsmith'その後、MySpace のサーフィンに戻ります。ただし、トリガーは姓がすでに「Smith」であることを気にしないため、LastUpdate は現在午後 2 時を示しています。

更新ステートメントが実行されるたびに LastUpdate をやみくもに変更する場合、更新が行われたため技術的には正しいですが、実際に変更を比較してそれに応じて行動する方がおそらくより理にかなっています。そうすれば、同僚による午後 2 時の Update ステートメントは引き続き実行されますが、LastUpdate は引き続き午前 8 時を示します。

--ケビン

于 2008-08-30T16:02:47.387 に答える
4

デフォルトの制約は挿入でのみ機能します。更新にはトリガーを使用します。

于 2008-08-30T14:55:17.923 に答える
3

サブクエリの代わりに結合を使用して挿入しますが、トリガーのアイデアに同意します。ただし、ユーザー名は主キーとして特に不適切な選択であることを指摘したいと思います。ユーザー名は頻繁に変更されますが、変更する場合は、関連するすべてのテーブルを変更する必要があります。キーとしてユーザーIDを使用し、ユーザー名に一意のインデックスを付けることをお勧めします。その後、ユーザー名が変更されても、他に何も変更する必要はありません。

于 2009-04-15T13:29:41.610 に答える
2

そのためにトリガーを使用する必要があります。

于 2008-08-30T14:50:08.123 に答える
-1

私の提案は、lastUpdateをデフォルトでgetdate()に設定するストアドプロシージャを作成することです。

SQL2005より前のトリガーを見つけて編集するのは面倒だったので、私は過去にトリガーを避けようとしました。特に、プロジェクトに不慣れな開発者向けです。

また、それを列定義のデフォルト値として追加します。

于 2008-08-30T14:58:38.930 に答える