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

このQ&Aのポイント
  • あるテーブルに追加処理を行った場合、ストアドを実行したく、トリガを作成してみましたが、エラーが出てしまい困っています。
  • エラー内容で検索してもあまり出てこないので、初歩的且つ、根本的に間違っているかと思うのですが、具体的な対処方法をご教示頂きたく、投稿させて頂きます。
  • 目的としては対象テーブルを実行するとトリガを発動し、【dbo.mail_test】を起動させたい
回答を見る
  • ベストアンサー

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

あるテーブルに追加処理を行った場合、ストアドを実行を実行したく、 トリガを作成してみましたが、 『トランザクションはトリガーで終了しました。バッチは中止されました。』という エラーが出てしまい困っています。 エラー内容で検索してもあまり出てこないので、 初歩的且つ、根本的に間違っているかと思うのですが、 初めて作成した為、なにがいけないのかも検討がつかない為、 ご教示頂きたく、投稿させて頂きます。 ○トリガ 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文を実施するとエラーなってしまいますので どうすればよいのか具体的な対処方法をご教示頂きたく、 何卒宜しくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • IDii24
  • ベストアンサー率24% (1597/6506)
回答No.1

問題はdbo.mail_test の権限なのでは? このストアドは単独では実行できるのですよね。であればまずこのストアドの中身をそのままトリガーに記述して実行できるか試してみることです。 メールを飛ばす機能?だと思いますが、その場合権限は重要ですよ。

bows_0307
質問者

お礼

問題は解決しました。 原因は入れ子のトランザクションだったようでした。

bows_0307
質問者

補足

【mail_test】は単独実行出来ます。 権限とありますが、実行方法は管理者権限でSSMSにログインし、 単純に対象テーブルにInsert文を実行しているだけなんですが、 『トランザクションはトリガーで終了しました。バッチは中止されました』というエラーが発生しています。 ちなみにトリガーの記載の仕方には問題ありませんでしょうか?

関連する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されなくなることを危惧しているためです。

  • SQLServerのトリガ機能について質問です 

    質問です! 困っているので早めの回答を望みます! <困っていること>  SQLServer2005のシステムテーブル名「dba.sysprocesses」に データがInsertされた事をトリガとして起動し、Insertされた データを別テーブル(1テーブルで新規作成するテーブル) に反映したい。 システムテーブル内へのInsertをトリガとした処理は 可能なのでしょうか。 また、デメリット面などございましたら合わせて教えてください。 

  • 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以外のテーブル の値を取ってくることは可能でしょうか? よろしくお願いします。

  • トリガ実行時のエラー (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本にまとめたいのですが、力量不足 + 時間不足です) 字数制限の関係で、書けませんが、他のトリガとの兼ね合いで問題が生ずることはあり得るのでしょうか? コメントをお待ちしております。

  • ストアドの一時テーブル格納について

    ストアドの一時テーブル格納について SQLServer2000を使用しています。 sp_help_jobの結果セットを一時テーブルにいれたく、 以下のようなスクリプトを作成しています。 -------------- create table #tbl (  列名  ・  ・  ・ ) Insert into #tbl msdb.dbo.sp_help_job -------------- スクリプトを実行すると、以下のエラーでInsertに失敗します。 「メッセージ 8164、レベル 16、状態 1、プロシージャ sp_get_composite_job_info、行 72 INSERT EXEC ステートメントは入れ子にはできません。」 上記の改善策についてアドバイス頂けないでしょうか。 よろしくお願いします。

  • T-SQLで一時テーブルの名前を毎回変更できるストアドを作りたい

    お世話になります。 初歩的な質問で恐縮ですがご教示いただければ幸いです。 T-SQLでグローバル一時テーブルの名前を毎回変更できるストアドを作り、Access2003アプリから実行させる予定です。 ストアドに、CREATE TABLE [dbo].[@tablename]のように書き、 ストアド実行時に@tablenameの値を ##ABC のように入力したのですが、テーブルはtempdbではなく、しかもテーブル名は@tablenameでテーブルが作成されてしまいます。 CREATE TABLE [dbo].@tablename のように[]をとると ストアド自体を作成できずエラーになってしまいます。 宜しくお願いします。 create PROCEDURE [dbo].[ストアドプロシージャー名] (@tablename nvarchar(255)) AS BEGIN from SET NOCOUNT ON; CREATE TABLE [dbo].[@tablename] <以下省略>

  • トリガが設定されたMySQL5.5準同期

    MySQL5.5の準同期レプリケーションを使って、マスターサーバー(insert用)とスレーブサーバー(select用)を組み合わせたサイトを作る予定です。 マスター側のサイトはトリガーとイベントを多用しております。(トリガー13個、イベント8個) 当初、マスター側にもスレーブ側にもどちらにもトリガーとイベントを組み込んでいましたが、テストして分かったことは、イベントがエラーを起こすということでした。 マスター側でイベントが始まり結果をスレーブ側に送ることになるわけですが、同時間にスレーブ側のイベントも始まるわけなので、マスターの結果が送られてきたときにはスレーブのテーブルには計算後の数値が記載されており、結果エラーになってしまうことがわかりました。 そのため、スレーブ側のイベントは削除して構築しています。 問題はトリガーについてです。 マスター側にはAテーブルにインサートするとBテーブル、Cテーブル、Dテーブルが連鎖的に変更されるトリガを組んでおり、スレーブ側も同様のトリガを組んでいます。 幸い、いままでのテストでは、トリガーで計算した値が連鎖的に伝わってもエラーになっていません。 ただ、マスター側に高負荷が掛かり、マスターのトリガの計算よりもスレーブ側の計算のほうが早く終了した場合、イベントの時に起こったエラーが出ないか懸念しています。 テストで壊れるのはいいですが、実際に運用した後で壊れることは許されません。 質問としては、「実際にトリガーを使った高負荷サイトを構築されている方でスレーブサーバーを準同期で設定している方」から、どのように組めばよいかのアドバイスを頂きたいというものです。(こんな高負荷サイトで運用しているがトリガを組んでて問題ないなどという例があるとうれしいです) よろしくお願いいたします。 スレーブのトリガーを外すのが一番簡単な方法なのですが、万一マスターがハングアップした際にはスレーブを昇格させる予定ですので出来る限りトリガーはそのままにしたいと考えておりますが、スレーブ側にトリガを組んだままというのは常識的にあり得ないというアドバイスであればそれでも結構です。 これはお願いなのですが、「他のサイトを調べて回答する」という方は申し訳ございませんがご遠慮願います(私も簡単なテストは済ませており低負荷では問題が生じないことまでは分かっております。ブログに落ちているような経験値はこれと大差ありません。この程度ではアドバイスにならないと感じています。) 実際に運用経験があり、正確な知識をお持ちの方にアドバイス頂きたいと思います。 よろしくお願いいたします。 構成はCentOS 6.3 MySQL 5.5.28です。

    • ベストアンサー
    • MySQL
  • 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

  • 【2005】トリガエラー時の呼び出し元のコミット

    はじめまして。 現在、SQLServer2005を利用したアプリケーションのメンテナンスを行っています。 今回、あるテーブルに変更があった際に、その内容を他テーブルに登録するという内容のプログラムを作成しています。 本来であれば、アプリケーション側にてそのテーブルに対する変更時に、併せてもう一つのテーブルに内容を書き込めばいいのですが、現状のアプリケーションが全体の仕様書がなく、該当テーブルに変更を行う部分を全て洗い出すことが難しい状況となっています。 そのためにトリガにて処理を行おうと考えています。 ここで、質問です。 トリガ内でエラーが発生した時、通常であれば呼び出し元のクエリまでロールバックされてしまいますが、トリガでの処理のみロールバックを行い、呼び出し元の処理はコミットしたいと考えています。 トリガ内にて例外をcatchして、その部分でraiserrorを発行しなければ 可能かと思い、そういう実装を行ったのですが、やはり呼び出し元のクエリまでロールバックされてしまいます。 トリガでの処理のみロールバックし、呼び出し元のクエリはコミットするような方法をご存知でしたらご教示ください。 よろしくお願いします。

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

    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