• 締切済み

SymfoWareでトリガの作成

SymfoWareでトリガを作成したいと思います。 CREATE TRIGGER トリガ名 AFTER INSERT ON 表1 REFERENCING NEW AS NEWREC FOR EACH ROW WHEN(条件)        INSERT INTO 表2 VALUES(NEWREC.項目名, NEWREC.項目名,…) となりますが、 WHENの条件に表1以外の表の値を持ってくることは できるのでしょうか? それから、表2にINSERTするVALUEの値も、表1以外のテーブル の値を取ってくることは可能でしょうか? よろしくお願いします。

みんなの回答

回答No.2

前の方の回答方法ではダメな場合はプロシジャを呼び出すようにして、回避したことあります。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

条件に関しては、副問い合わせを使えば、こんな感じで出来そうな気がしますが・・・ WHEN(NEWREC.A IN(SELECT A FROM 表3)) 別のレコードの追加はこんな感じになると思います。 INSERT INTO 表2 select 表4.A, 表4.B, NEWREC.項目名1 from 表4 where 表4.A = NEWREC.項目名2 Symfoないので確認できません。すみません。

naonaonaona
質問者

お礼

回答ありがとうございました。 INSERT文、早速試してみます♪ 条件の方に関しては、Symfoの制約上、副問合せの指定が出来ないようなんです。 Symfoでは厳しいのかな…

関連するQ&A

  • トリガに排他制御をかけたいのですが

    トリガに排他制御をかけたいのですが Oracleのトリガで、 トリガ内の処理に対して排他制御をおこないたいのですが、 どのように設定すればよいのでしょうか? トリガの内容は以下となります。 CREATE OR REPLACE TRIGGER TRI_TEST after update of (トリガの実行条件その1) on ORG_TBL FOR EACH ROW begin if (トリガの実行条件その2) THEN begin insert(実行される処理その1) EXCEPTION update(実行される処理その2) end; end if; end; / 上記の条件において、 「実行される処理その1」 「実行される処理その2」 を行っている最中に他からのアクセスをブロックをさせたく思っております。 本件の理由は 他からのアクセスで行われる処理が 「select(トリガによってデータが投入されてるテーブル)」 「truncate(トリガによってデータが投入されてるテーブル)」 を連続して行う処理のため、 排他を実行しなかった場合、 他からのアクセスの「select」と「truncate」の処理間に トリガによってレコードがinsertされた際に、 そのレコードがselectされなくなることを危惧しているためです。

  • 続・トリガーの起動条件について質問です。

    先ほど書き込みしたものの回答が得られないので、 質問内容を少し変えます。 トリガーを作成する際に WHEN句に書き込める制限などはあるのでしょうか? 試しに CREATE OR REPLACE TRIGGER INS_01 AFTER INSERT ON A_TBL FOR EACH ROW WHEN(NEW.ID = (SELECT ・・・)) BEGIN ・・・・ END; / と書いたところ ORA-02251: ここでは副問合せは使用できません。 と怒られました。 また:NEWや:OLDの使えるはどの値を持ってくるのでしょうか? 自分はINSERT時には:NEWはVALUESの値、:OLDはNULL。 UPDATE時は:NEWはSETした値、:OLDはWHERE句で指定したレコードの値だと思っています。 間違いや補足ありましたら教えていただけると幸いです。 宜しくお願いします。

  • トリガからストアド実行について

    あるテーブルに追加処理を行った場合、ストアドを実行を実行したく、 トリガを作成してみましたが、 『トランザクションはトリガーで終了しました。バッチは中止されました。』という エラーが出てしまい困っています。 エラー内容で検索してもあまり出てこないので、 初歩的且つ、根本的に間違っているかと思うのですが、 初めて作成した為、なにがいけないのかも検討がつかない為、 ご教示頂きたく、投稿させて頂きます。 ○トリガ ALTER TRIGGER [dbo].[TRIG_SEND_MAIL] ON [dbo].[SEND_MAIL_INFO] FOR INSERT AS begin EXEC dbo.mail_test end ○目的としては対象テーブルを実行するとトリガを発動し、【dbo.mail_test】を起動させたい insert into SEND_MAIL_INFO (PROFILE_NAME,SEND_FLG) values ('AAAAAA','0') 上記SQL文を実施するとエラーなってしまいますので どうすればよいのか具体的な対処方法をご教示頂きたく、 何卒宜しくお願い申し上げます。

  • SQL Serverトリガの中でDMLの種類判断

    SQL Serverのトリガの中で、DMLの種類(INSERT/UPDATE/DELETE)を取る方法ってありますか? こんにちは。アべです。 下記のようなトリガを作成して、操作(INSERT/UPDATE/DELETE)の履歴を 残したいのですが、トリガを3本に分けるのもあれなので、 操作の種類(INSERT/UPDATE/DELETE)を履歴用のテーブルに入れたいのですが、 書き方がわかりません。 取得方法のやり方を教えてもらえないでしょか? CREATE TRIGGER [mst].[TriggerUserActionHistory] ON [mst].[User] AFTER INSERT, UPDATE, DELETE NOT FOR REPLICATION AS BEGIN SET NOCOUNT ON; --ACTION TYPE未設定 ↓今はINSERT固定しかできない。 insert into [history].[User] select 'INSERT',getdate(),* from inserted; END GO

  • postgreSQLでint8で設定された項目にデータを挿入したいのですが、教えて下さい。

    例えば、下記のようなテーブルを作成し、 create table testm ( data1 int8, data2 int8, data3 int8 ); 普通全ての項目に値があれば、1行挿入することができますが、 insert into testm values (1, 2, 3); もし、値がないのに、項目に挿入したい場合は、できるのでしょうか? insert into testm values (1, , 3); 教えて下さい。それが出来なかった場合の対処方法も教えて下さい。

  • トリガで複数行のインサートを実行したい

    mysql 5.5.16で、全体ユーザーから誕生日が来た人だけを選別する仕組みを作っています。 テーブル user (id_1 INT, user_1 TEXT,count_1 INT,nextbirthday_1 DATETIME) テーブル 20years (id_2 INT, user_2 TEXT,nextbirthday_2 DATETIME) userテーブルには1000人の19才ユーザーが配置されています。 このリストから「20才の誕生日が着たら20yearsテーブルに複写させる」ことを考えました。 まずは、EVENT でrecordにある1000人のユーザー全ての count_1 を毎日1回づつUPDATEさせます。 このアップデートをTRIGGERとして、誕生日と現在時間を見合わせ、誕生日が現在時間より古いユーザーは(誕生日が来たものは)20yearに複写させることを考えました。 その案が下記のEVENT とTRIGGERです。 ******************************** CREATE EVENT happybirthday ON SCHEDULE EVERY 1 DAY STARTS '2012-04-25 09:00:00' ENDS '2013-03-31 09:00:00' DO UPDATE record SET count_1 = count_1 + 1; ******************************** DELIMITER // CREATE TRIGGER 20_trigger AFTER UPDATE ON record FOR EACH ROW BEGIN IF(SELECT NEW.nextbitthday_1 <= NOW()) THEN INSERT INTO 20years SET id_2=NEW.id_1,user_2=NEW.user_1,nextbirthday_2=NEW.nextbirthday_1 ON DUPLICATE KEY UPDATE id_2=NEW.id_1; END IF; END; // DELIMITER ; ******************************** FOR EACH ROW BEGIN で全てのユーザーの誕生日を見に行き、誕生日に4人が該当すれば4人が20yearsに複写されるはずです。 しかし実際には、該当する一番上の一人だけしか複写させることが出来ませんでした。 (本日誕生日のユーザーが4人いて、4/16以前が誕生日の人が10人いた場合、それら合計14人のうち、userテーブル上で一番上に位置するユーザーだけが複写される) このトリガの書き方では、FOR EACH ROW BEGINと設定しているにも関わらず、全てのユーザーに対してトリガ作業を行わず、上から一人目を抽出した時点で作業を終了しているようです。 アドバイスを頂けましたら幸いです。 尚、ニーズは誕生日が来たユーザーだけを移動することですので、私の発案の方法に限らずもっといい方法があればアドバイスをお願いいたします。 追伸 IF節を全て外しても同様に一人しか抽出しませんでしたので、IF節が悪さをしている訳ではないようです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • PL/SQLでREPRACE INTO構文と同様の処理を作成

    PL/SQLでREPRACE INTO構文と同様の処理を作成 別のテーブルにレコードを投入する処理を実行するトリガを作成したのですが、 プライマリ・キーが重複するレコードの投入時に、一意制約でエラーになってしまいます。 トリガの作為としましては、プライマリキーが重複する際には上書きさせたいのですが、この場合、PLSQLではどのようなコマンドがあるのでしょうか? (mySQLのREPLACE INTO と同様の処理を行うコマンドを想定しています) ↓下記のINSERT INO の箇所をREPLACE INTOと同様の処理を行うコマンドにしたいと思っております CREATE OR REPLACE TRIGGER TRI_TEST after update of TRI_NAME ,TRI_CALLED on cp_MV_TABLE FOR EACH ROW begin if (:old.TRI_NAME != :new.TRI_NAME or :old.TRI_CALLED != :new.TRI_CALLED ) THEN INSERT INTO TR_RUS_TABLE ( TRI_NO , TRI_DATE , TRI_NAME , TRI_CALLED ) values ( :new.TRI_NO , :new.TRI_DATE , :new.TRI_NAME , :new.TRI_CALLED ); end if; end; /

  • トリガ実行時のエラー (ADP + MSDE2000)

    ADP + MSDE2000 環境にて、あるテーブルに下記のトリガを設定しました。 CREATE TRIGGER トリガ名 ON テーブル1 FOR DELETE  AS  BEGIN   DECLARE @変数 varchar(32)   SELECT @変数 = 列1 FROM deleted   DELETE FROM テーブル2   WHERE テーブル2.列1 = @変数  END 意図するところは、別のテーブル (テーブル2) からの同一キー (列1) を持つレコードの連動削除です。 このトリガを仕込んだテーブルに対してADPのGUI (テーブルのデータシートビュー) より手動にて直接 レコード削除を試みると、 「キー列の情報が足りないか、正しくありません。更新の影響を受ける行が多すぎます。」 のエラーが発生します。 (データシートビューを一度閉じた後、再度開くと、意図したレコードは消えています) GUIを使用せず、DELETE文で削除した場合、このエラーは出ず、動作結果も意図通りなのですが、前述の エラーは無視してよいものでしょうか? トリガの記述で問題点、改善すべき箇所があれば、ご指摘頂けると幸いです。 尚、このテーブルには、この他に3つのトリガが記述されています。 (できれば1本にまとめたいのですが、力量不足 + 時間不足です) 字数制限の関係で、書けませんが、他のトリガとの兼ね合いで問題が生ずることはあり得るのでしょうか? コメントをお待ちしております。

  • トリガーの起動条件で悩んでいます。

    超初心者です。 うまく説明できないかも知れませんが助けて下さい。 うまく動作しない処理は、 [A_TBL]が更新時に履歴あり・なしにそれぞれトリガーを用意しているのですが、 履歴なしの場合は[A_TBL]がUPDATEされるだけなので、 『[A_TBL]がUPDATEされたタイミングで[B_TBL]もUPDATEする』 という起動条件にしています。 履歴ありの場合は[A_TBL]のデータをUPDATEで無効化(FLGを立てます)し、 その後、更新データをINSERTで登録しようと思っています。 そのためトリガーの起動条件を、 『[A_TBL]がINSERTされたタイミングで[B_TBL]のデータをUPDATEする』 としていますが、 [A_TBL]に新規登録時のトリガーの起動条件が、 『[A_TBL]にINSERTされたタイミングで[B_TBL]にもINSERTする』 としているので、 [A_TBL]にINSERTされると両方のトリガーが起動してしまい、 怒られました。 自分の作ったトリガーを書いておくので どのようにしたらよいのか教えていただけませんでしょうか? トリガーの書き方におかしな点があったらご指摘もお願い致します。 よろしくお願いしますm(_ _)m 新規登録のトリガー CREATE OR REPLACE TRIGGER INS_01 AFTER INSERT ON A_TBL FOR EACH ROW BEGIN INSERT INTO B_TBL( ID, 姓, 名, 住所, 本籍, 電話番号, 郵便番号 )VALUES( :NEW.ID, :NEW.姓, :NEW.名, :NEW.住所, :NEW.本籍, :NEW.電話番号, :NEW.郵便番号 ); END; / 更新のトリガー CREATE OR REPLACE TRIGGER UP_01 AFTER INSERT ON A_TBL FOR EACH ROW BEGIN UPDATE B_TBL SET 姓 = :NEW.姓, 名 = :NEW.名, 住所 = :NEW.住所, 本籍 = :NEW.本籍, 電話番号 = :NEW.電話番号, 郵便番号 = :NEW.郵便番号 WHERE ID = :NEW.ID ; END; /

  • POSTGRESQLデフォルトのシーケンス値を強制

    以下の(2)(3)のaをデフォルトであるシーケンスの値を強制入力しエラーを回避する方法はありますか? create sequence testseq start 1; create table test(a int not null default nextval('testseq'), b int); --(1)成功 insert into test (b) values(0); --(2)エラー insert into test (a,b) values(null,0); --(3)エラー insert into test values(null,0);