質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

386閲覧

SQL Serverのトリガーでinsert時に作成日時、update時に更新日時をセットする

propg

総合スコア113

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2023/10/06 02:21

SQL Serverのトリガーでinsert時に作成日時、update時に更新日時をセットする

件名の通り、トリガーによって、作成日時、更新日時を自動セットしたいです。

insertトリガーで作成日時をセットした場合、トリガー内のupdateによってupdateトリガーも実行されてしまい、更新日時も自動的にセットされます。
希望する動きとしては、insert時には更新日時をセットしたくありません。
Bingチャットでも聞いてみましたが、結局ダメでした。

sql

1CREATE TABLE YourTable 2( 3 ID INT IDENTITY(1,1) PRIMARY KEY, 4 SomeData NVARCHAR(100), 5 createDateTime DATETIME NULL, 6 updateDateTime DATETIME NULL 7) 8 9CREATE TRIGGER trg_Insert_YourTable 10ON YourTable 11AFTER INSERT 12AS 13BEGIN 14 UPDATE YourTable 15 SET createDateTime = GETDATE() 16 FROM YourTable 17 INNER JOIN inserted ON YourTable.ID = inserted.ID 18END 19 20CREATE TRIGGER trg_Update_YourTable 21ON YourTable 22AFTER UPDATE 23AS 24BEGIN 25 UPDATE YourTable 26 SET updateDateTime = GETDATE() 27 FROM YourTable 28 INNER JOIN inserted ON YourTable.ID = inserted.ID 29 WHERE YourTable.createDateTime IS NOT NULL 30END

この状態で

SQL

1insert into YourTable (SomeData) values ('test')

を実行すると、CreateDateTime, UpdateDateTimeの両方に日付がセットされます。
イメージ説明
updateトリガー時にinsertトリガーが動いた結果であることが判別できれば良いと思うのですが、現在の記述では正しく機能していません。
仕組み上実現は可能でしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

もう少しスマートなやり方がありそうですが、たとえば以下のような方法で実現できるかと思います。

  1. INSERTトリガではupdateDateTime をダミー値で更新しておく (以下の例では'9999/12/31')
  2. そのあとに動くUPDATEトリガでは、updateDateTimeにダミー値が入っていたらNULLに更新する。NULLもしくはダミー値以外の値が入っていたら、現在時刻に更新する。

SQL

1CREATE OR ALTER TRIGGER trg_Insert_YourTable 2ON YourTable 3AFTER INSERT 4AS 5BEGIN 6 UPDATE YourTable 7 SET createDateTime = GETDATE(), updateDateTime = '9999/12/31' 8 FROM YourTable 9 INNER JOIN inserted ON YourTable.ID = inserted.ID 10END; 11 12 13CREATE OR ALTER TRIGGER trg_Update_YourTable 14ON YourTable 15AFTER UPDATE 16AS 17BEGIN 18 UPDATE YourTable 19 SET updateDateTime = IIF(inserted.updateDateTime = '9999/12/31', NULL, GETDATE()) 20 FROM YourTable 21 JOIN inserted ON YourTable.ID = inserted.ID 22END;

投稿2023/10/06 05:12

neko_the_shadow

総合スコア2273

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

propg

2023/10/06 06:16

提示いただいた方法で対応できそうです。 INSERT直後のUPDATEであることをどこかに示せばいいと思いましたが、提示していただいた方法は分かりやすくてよいと思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問