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




技術評論社の書籍ガイドへ
上巻:ISBN4-7741-0965-7

ウィンドウを閉じる


(株)日本技術ソフト開発 責任編集:堀川 明
MSDE FunClubに関するご意見・ご要望等ございましたら、 msdefun@horikawa.ne.jp までご連絡下さい。
HOME: http://www.horikawa.ne.jp/msde/


MSDE FunClubの運営は、マイクロソフト社とは一切の関係はありません