MSDE FunClub | 最終更新日 : 2000/08/17 | |
Microsoft Data Engine FunClub |
|
|
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻) | ||
【第6章348p 〜 351p掲載】 |
-- [SQL06_02.SQL] -- SQLServer7.0 Transact-SQL言語 -- 日本技術ソフト開発 堀川 明 -- http://www.horikawa.ne.jp/msde/ -- -- このSQLプログラムは、 -- トリガを利用してレコードの挿入時刻と更新時刻をフィールド -- に記録します -- -- カレントデータベースを MySampleTest にする USE MySampleTest GO -- (件処理されました)のメッセージを抑止する SET NOCOUNT ON GO -- ************************************************* -- 見本テーブルの作成 -- ************************************************* -- 既存テーブルが存在したら削除します IF( (object_id('更新時刻記録例題') IS NOT NULL) AND OBJECTPROPERTY( object_id('更新時刻記録例題'),'ISTABLE') = 1 ) BEGIN -- PRINT 'テーブルが存在したので削除しました' DROP TABLE 更新時刻記録例題 END GO -- 新しくテーブルを作成する -- 更新時刻は、この例題では秒単位で扱います -- SMALLDATETIME型は分単位です CREATE TABLE 更新時刻記録例題 ( -- 主キー ID int CONSTRAINT PK_KEY PRIMARY KEY , -- 適当なデータです DATA varchar(10) , -- レコード新規登録時刻 挿入時刻 datetime DEFAULT NULL , -- レコード最終更新時刻 更新時刻 datetime DEFAULT NULL ) GO -- ************************************************* -- トリガの登録 -- レコードの更新時刻をフィールドに登録します -- ************************************************* CREATE TRIGGER TR_更新時刻 -- トリガの名前 ON 更新時刻記録例題 -- トリガを組み込むテーブル ----------- FOR UPDATE -- 更新時処理 ----------- AS -- 挿入時刻 と 更新時刻 が同時に更新されたのは、挿入時トリガ -- (TR_挿入時刻)の内部でUPDATE命令が実行されたためです -- 挿入時トリガから呼び出された場合は、更新時刻設定は行いません -- このIF文チェックを入れることによって、レコード新規登録時では -- 挿入時刻と更新時刻が一致することを保証します IF UPDATE(挿入時刻) AND UPDATE(更新時刻) BEGIN -- TR_挿入時刻 から呼び出されたときは無視します -- RAISERROR('UPDATE Trigger を無視しました',0,1) WITH NOWAIT RETURN END --RAISERROR('UPDATE Trigger!!',0,1) WITH NOWAIT -- 更新時刻を設定する UPDATE 更新時刻記録例題 SET 更新時刻 = GETDATE() FROM 更新時刻記録例題 , inserted WHERE 更新時刻記録例題.Id = inserted.Id -- RAISERROR('UPDATE Trigger END',0,1) WITH NOWAIT GO CREATE TRIGGER TR_挿入時刻 -- トリガの名前 ON 更新時刻記録例題 -- トリガを組み込むテーブル ----------- FOR INSERT -- 挿入時処理 ----------- AS DECLARE @tm datetime SET NOCOUNT ON -- SELECT文のメッセージの抑止 --RAISERROR('INSERT Trigger!!',0,1) WITH NOWAIT -- 今の時刻を取得する SELECT @tm = GETDATE() -- 挿入時時刻と更新時時刻を設定する -- このUPDATE命令により、更新トリガ(TR_更新時刻)が起動される UPDATE 更新時刻記録例題 SET 挿入時刻 = @tm , 更新時刻 = @tm FROM 更新時刻記録例題 , inserted WHERE 更新時刻記録例題.Id = inserted.Id -- RAISERROR('INSERT Trigger End',0,1) WITH NOWAIT GO -- ************************* -- データ登録処理の実行 -- ************************* INSERT INTO 更新時刻記録例題(ID,DATA) VALUES(10,'TETS-10') WAITFOR DELAY '00:00:02' INSERT INTO 更新時刻記録例題(ID,DATA) VALUES(20,'TETS-20') WAITFOR DELAY '00:00:02' INSERT INTO 更新時刻記録例題(ID,DATA) VALUES(30,'TETS-30') WAITFOR DELAY '00:00:02' INSERT INTO 更新時刻記録例題(ID,DATA) VALUES(40,'TETS-40') PRINT '' RAISERROR('レコードの新規登録時の出力です。挿入時刻と更新時刻は同じ',0,1) WITH NOWAIT SELECT * FROM 更新時刻記録例題 WAITFOR DELAY '00:00:05' GO UPDATE 更新時刻記録例題 SET DATA = '****-**' WHERE ID BETWEEN 20 AND 30 RAISERROR('レコードの更新をしました。更新時刻を修正します',0,1) WITH NOWAIT SELECT * FROM 更新時刻記録例題 GO -- ****************************** -- 複数レコード同時操作チェック -- ****************************** --テストを実行するときはRETURN命令をコメントにしてください RETURN --ローカル一時テーブルの作成 CREATE TABLE #TMP_更新時刻記録例題 (ID int , DATA varchar(10)) --データの登録 INSERT INTO #TMP_更新時刻記録例題 VALUES(10,'TETS-10') INSERT INTO #TMP_更新時刻記録例題 VALUES(20,'TETS-20') INSERT INTO #TMP_更新時刻記録例題 VALUES(30,'TETS-30') INSERT INTO #TMP_更新時刻記録例題 VALUES(40,'TETS-40') --複数レコードの登録 DELETE FROM 更新時刻記録例題 INSERT INTO 更新時刻記録例題(ID,DATA) SELECT * FROM #TMP_更新時刻記録例題 --結果の表示 SELECT * FROM 更新時刻記録例題 WAITFOR DELAY '00:00:05' --複数レコードの更新 UPDATE 更新時刻記録例題 SET DATA = '更新した' WHERE ID BETWEEN 20 AND 30 --結果の表示 SELECT * FROM 更新時刻記録例題 -- 一時テーブルの削除 DROP TABLE #TMP_更新時刻記録例題 GO