17.10 - 例: トリガー内からのSQLプロシージャの呼び出し - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 構文規則および例

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-171K-JPN
Language
日本語 (日本)

次のトリガーは、文書に対する変更を追跡するために使用します。文書テーブルおよびジャーナル テーブルがあります。文書テーブルが変更されると、トリガーはジャーナル テーブルを変更します。別のアプリケーションが、ジャーナル テーブルの行を処理して除去します。トリガーは、文書テーブル内の対応する行ごとに最大で1つの行がジャーナル テーブルにあることを保証します。そのため、文書が複数回変更される場合、トリガーはその文書のために単一のジャーナル行を保守します。

     CREATE TABLE document_table (
       docnum   INTEGER, 
       document BLOB)
     UNIQUE PRIMARY INDEX(docnum);
     CREATE TABLE document_journal_table (
       docnum INTEGER, 
       action CHARARACTER(1))
     UNIQUE PRIMARY INDEX(docnum);
     CREATE TRIGGER log_inserts_to_doc AFTER INSERT ON document_table
      REFERENCING new AS new_row
      FOR EACH ROW
      BEGIN ATOMIC
        CALL insert_doc_journal( new_row.docnum );
      END;
     CREATE PROCEDURE insert_doc_journal(IN docnum INTEGER)
       BEGIN
         DECLARE num_delete_journal_records INTEGER;
           SELECT COUNT(docnum) INTO :num_delete_journal_records
           FROM document_journal_table
           WHERE docnum=:docnum 
           AND   action = 'D';
        IF num_delete_journal_records > 0 THEN
          -- We have a delete journal record.  So, this document
          -- was previously deleted and now they are inserting it.
          -- A delete followed by an insert is really an update so
          -- remove the delete journal record and add an update
          -- change the journal record
           UPDATE document_journal_table 
           SET action = 'U' 
           WHERE docnum = :docnum;
        ELSE
          -- We either have no journal records or we have an insert or
          -- update record. An insert followed by an insert is still an
          -- insert. An insert followed by an update is really an insert
          -- so remove any journal record and add an insert journal           -- record.
           UPDATE document_journal_table 
           SET action = 'I' 
           WHERE docnum = :docnum;
           ELSE INSERT INTO document_journal_table VALUES (:docnum,'I');
        END IF;
     END;