| MSDE FunClub |
|
最終更新日 : 2000/08/17 |
|
Microsoft Data Engine FunClub
|
Since 2000.08.17
|
|
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