PostgreSQLトリガーの不具合を解決する方法について

このQ&Aのポイント
  • 現在、保守対応を行っているシステムにて、PostgreSQLトリガーの不具合が発生しています。updateコマンドを実行すると、mst_exam_resultというテーブルも更新される問題があります。
  • pgadminでの確認結果から、トリガ関数が存在しないことがわかりました。また、関数の中にmst_exam_resultに関連する処理も見つかりませんでした。
  • トリガ関数や関数の中身を確認するために、詳細な手順を教えていただけると助かります。
回答を見る
  • ベストアンサー

postgresqlトリガー

現在、保守対応を行っているシステムにて、 不明点があり、皆様にご助言を頂ければ幸いで御座います。 ■使用環境 "PostgreSQL 8.1.23 on i686-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51)" ■現状 update tbl_result_interview set {割愛} where {割愛} を実行すると mst_exam_resultというテーブルも更新がされます。 恐らくトリガーが引かれているのかと考えているのですが、 実態が確認出来ず苦慮しております。 =================================================== \d+ tbl_result_interview Column | Type | Modifiers | Description --------------+-----------------------------+-------------- {割愛} Indexes: "tbl_result_interview_pkey" PRIMARY KEY, btree (app_id) Foreign-key constraints: "tbl_result_interview_app_id_fkey" FOREIGN KEY (app_id) REFERENCES tbl_app_exam(app_id) Has OIDs: no =================================================== \d+ mst_exam_result Column | Type | Modifiers | Description --------+------------------------+-----------+----------------------------------------- {割愛} Indexes: "mst_exam_result_pkey" PRIMARY KEY, btree (code) Has OIDs: no =================================================== ちなみにpgadminで確認しても、トリガ関数(0)と出ており、 トリガはなさそうです。 関数は数個ありますがmst_exam_resultに更新処理を行う様な記述は見れません。 update tbl_result_interview set {割愛} where {割愛}により、 mst_exam_resultが更新されるのですが、 実態がわからず、確認項目でも構いませんので、 ご助言、ご指摘頂ければ幸いで御座います。 以上、引き続き宜しくお願い致します。

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

  • ベストアンサー
  • h271015
  • ベストアンサー率71% (62/87)
回答No.1

mst_exam_result は tbl_result_interview を継承して作成されたテーブルではないでしょうか? もしそうであれば、Update文で指定するテーブル名の前にONLYを指定することで、指定されたテーブルのみで一致する行が更新されると思います。 (試行される場合、念のため、動作をご確認のうえでの実施をお願いいたします。)

関連するQ&A

  • テーブル構造の表示

    PostgreSQLの場合テーブルhogeの構造を表示するのに下記のように実行しますがSQL Serverでも同じ様なことはできないでしょうか? (コマンド実行) => \d hoge (実行結果) Table "public.hoge" Column | Type | Modifiers --------+---------+----------- class | integer | not null id | integer | not null name | text | Indexes: "hoge_pkey" PRIMARY KEY, btree ("class", id) ※表示された結果をコピペしてドキュメント等の作成に使いたいです。 宜しくお願い致します。

  • ADOX フィールドのRequiredプロパティを

    ADOX フィールドのRequiredプロパティをFalseにしたい アクセスです。 Sub test() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim idx As ADOX.Index Dim varRet As Variant Dim strMsg As String Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection Set tbl = New ADOX.Table tbl.Name = "test" tbl.Columns.Append "氏名ID", adInteger '手作業で数値型のフィールドを作るとこれがデフォルトになる tbl.Columns.Append "氏名", adVarWChar, 50 cat.Tables.Append tbl 主キーを作る Set idx = New ADOX.Index idx.Name = "Primary" idx.PrimaryKey = True idx.Columns.Append "氏名ID" tbl.Indexes.Append idx MsgBox tbl.Name & "テーブルを作成しました。" Set cat = Nothing End Sub ********************************************************** 上記のコードでテーブルを作ると、RequiredをTrueにしてないのに、 実際にテーブルにデータを入れてる時に、NULLにしようとすると、 ********************************************************** フィールドに必要なプロパティが True に設定されているため、 このフィールド '<フィールド名>' には Null 値は挿入できません。値を入力してください。 ********************************************************** となります。 Requiredプロパティの規定値は、False になってますが、 なぜか値を要求されてしまいます。 ADOXで上記のコードに追加してRequiredをFalse にする方法を教えてください。、

  • PHPの登録エラーの原因

    初めまして。今日からPHPの勉強を開始したのですが、以下のエラーメッセージが対処できずに困っています。 どなたか原因をご教授頂けませんか。 宜しくお願い致します。 Fatal error: Call to undefined function mysql_connect() in C:\touroku.php on line 6 【MariaDBの作業】 \mysql -u root -p Enter password: ******** MariaDB [(none)]> create database touroku; MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | touroku | +--------------------+ MariaDB [(none)]> use touroku; Database changed MariaDB [touroku]> create table touroku_tbl( -> id int not null auto_increment, -> name varchar(20) not null, -> email varchar(20) not null, -> primary key(id) -> ); Query OK, 0 rows affected (0.31 sec) MariaDB [touroku]> show tables; +-------------------+ | Tables_in_touroku | +-------------------+ | touroku_tbl | +-------------------+ 1 row in set (0.00 sec) MariaDB [touroku]> insert into touroku_tbl(name, email) values('test', 'test@local'); Query OK, 1 row affected (0.12 sec) MariaDB [touroku]> select * from touroku_tbl; +----+------+------------+ | id | name | email | +----+------+------------+ | 1 | test | test@local | +----+------+------------+ 1 row in set (0.00 sec) MariaDB [touroku]> 【touroku.html】 <html> <body> <form action = "touroku.php" method="post"> 名前:<input type="text" name="nm"> E-mail:<input type="text" name="email"> <input type="submit" name="exec" value="登録"> </form> </body> </html> 【touroku.php】 <html> <body> <?php //データベースに接続 $con = mysql_connect('127.0.0.1', 'root', 'password'); if (!$con) { exit('データベースに接続できませんでした。'); } //データベースを選択 $result = mysql_select_db('touroku', $con); if (!$result) { exit('データベースを選択できませんでした。'); } $result = mysql_query('SET NAMES utf8', $con); if (!$result) { exit('文字コードを指定できませんでした。'); } $nm = $_REQUEST['nm']; $email =$_REQUEST['email']; //フォームで送られてきたデータでINSSERT文を作成 $result = mysql_query("insert into touroku_tbl(name, email) values('$nm', $email)" , $con); if (!$result) { exit('データを登録できませんでした。'); } //SQLを実行 //if (!$res = mysql_query($sql)) { //echo "SQL実行時エラー" ; //exit ; //} //データベースから切断 $con = mysql_close($con); if (!$con) { exit('データベースとの接続を閉じられませんでした。'); } ?> <p>登録が完了しました。<br /><a href="index.html">戻る</a></p> </body> </html>

    • ベストアンサー
    • PHP
  • mySQLでINSERT Errorとなります。

    初心者です。よろしくお願いいたします。 データを入れたいのですが、エラーとなってしまいます。 以下でデータベースとテーブルを作成し、 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } $sql = 'CREATE DATABASE tori'; if (mysql_query($sql, $db)) { echo "データベースtori の作成に成功しました\n"; } else { echo 'データベースtoriの作成に失敗しました: ' . mysql_error() . "\n";} mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $query ="create table {$tbl_name} ( id char(8) primary key, date TEXT, sex TEXT, age TEXT )TYPE=MyISAM"; mysql_query($query); $query ="INSERT INTO `houzingpark`.`hatogaya` ( id , date , sex , iro ) VALUES ( '2', 'uu', 'ii', 'po' )"; mysql_close($db); ?> 以下で入れ込みたいのですが、出来ないのです。 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $sql="INSERT INTO hatogaya ( id , date , sex , iro ) VALUES ( 3, 2005-12-3, mesu, cya )"; mysql_query($sql); if(!$result){print 'INSERT Error!';} echo $sql; mysql_close($db); ?> でINSERTしようとするのですが、INSERT Error!と表示されてしまいます。 Adminで見るとデータベースとテーブルは出来ているのですが、どうしてもINSERTできないのです。 もう何時間も悪戦苦闘しております。 どなたかご指導よろしくお願いいたします。

  • トリガーが思うように動かない

    初心者です。 SQL SERVER 2012です。 「売上明細」テーブルに、新規行を挿入した時に、「得意先単価マスタ」を更新・または追加したい CREATE TRIGGER [dbo].[INSTEAD_OF_INSERT_ON_T_D売上明細] ON [dbo].[T_D売上明細] INSTEAD OF INSERT <<省略>> /* 得意先別単価マスタの更新 */ IF (@column_new_value$19 <> 0) BEGIN /* 得意先別単価マスタを参照する */ SET @CURSOR_PARAM_CRSTS_CRSTS_得意先コード = @column_new_value$9 SET @CURSOR_PARAM_CRSTS_CRSTS_納品先コード = @column_new_value$10 SET @CURSOR_PARAM_CRSTS_CRSTS_商品コード = @column_new_value$16 DECLARE crsTS CURSOR LOCAL SCROLL_LOCKS FOR SELECT dbo.T_M得意先別単価.作成日付, dbo.T_M得意先別単価.更新日付, dbo.T_M得意先別単価.得意先コード, dbo.T_M得意先別単価.納品先コード, dbo.T_M得意先別単価.商品コード, dbo.T_M得意先別単価.単価区分, dbo.T_M得意先別単価.売上単価1, dbo.T_M得意先別単価.売上単価2, FROM dbo.T_M得意先別単価 WHERE ((dbo.T_M得意先別単価.得意先コード = @CURSOR_PARAM_CRSTS_CRSTS_得意先コード) AND (dbo.T_M得意先別単価.納品先コード = @CURSOR_PARAM_CRSTS_CRSTS_納品先コード) AND (dbo.T_M得意先別単価.商品コード = @CURSOR_PARAM_CRSTS_CRSTS_商品コード)) OPEN crsTS FETCH NEXT FROM crsTS INTO @recTS$作成日付, @recTS$更新日付, @recTS$得意先コード, @recTS$納品先コード, @recTS$商品コード, @recTS$単価区分, @recTS$売上単価1, @recTS$売上単価2 /* 該当が有った場合は更新する */ IF (@@FETCH_STATUS = 0) IF (@column_new_value$19 = 1) UPDATE dbo.T_M得意先別単価 SET dbo.T_M得意先別単価.単価区分 = @column_new_value$19, dbo.T_M得意先別単価.売上単価1 = @column_new_value$22 WHERE CURRENT OF crsTS ELSE IF (@column_new_value$19 = 2) UPDATE dbo.T_M得意先別単価 SET dbo.T_M得意先別単価.単価区分 = @column_new_value$19, dbo.T_M得意先別単価.売上単価2 = @column_new_value$22 WHERE CURRENT OF crsTS ELSE IF (@column_new_value$19 = 1) INSERT INTO dbo.T_M得意先別単価 ( dbo.T_M得意先別単価.得意先コード, dbo.T_M得意先別単価.納品先コード, dbo.T_M得意先別単価.商品コード, dbo.T_M得意先別単価.単価区分, dbo.T_M得意先別単価.売上単価1 ) VALUES ( @column_new_value$9, @column_new_value$10, @column_new_value$16, @column_new_value$19, @column_new_value$22 ); ELSE IF (@column_new_value$19 = 2) INSERT INTO dbo.T_M得意先別単価 ( dbo.T_M得意先別単価.得意先コード, dbo.T_M得意先別単価.納品先コード, dbo.T_M得意先別単価.商品コード, dbo.T_M得意先別単価.単価区分, dbo.T_M得意先別単価.売上単価2 ) VALUES ( @column_new_value$9, @column_new_value$10, @column_new_value$16, @column_new_value$19, @column_new_value$22 ); CLOSE crsTS DEALLOCATE crsTS <<省略>> 上記のように作成してあるのですが、 すでに同一得意先・納品先・商品のマスタが存在する場合は、更新されます。 ですが、存在しない場合、新規に追加したいのですが、そこがうまく動きません。 何が原因でしょうか?

  • トリガーについて

    テーブルにAlter文でカラム追加などを行った場合、トリガーは実行されるのでしょうか? 追加するカラムにデフォルト値があるかなどの条件でも違うものなのでしょうか? どなたか教えてください。お願いいたします。 また、Alterでトリガーを無効にしたい場合はトリガーをドロップする方法が無難なのでしょうか?

  • トリガー

    4月に社会人になった新人です。 会社でたまに耳にする「トリガー」とはどういう意味ですか?

  • トリガーについて

    このジャンルでお願いします。 次のようなテーブルで DROP TABLE IF EXISTS item; CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, parent_id INT, name varchar(32) NOT NULL, level int NOT NULL, FOREIGN KEY (parent_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); INSERT INTO item (parent_id, name) VALUES (null, 'item6'); INSERT INTO item (parent_id, name) VALUES (6, 'item7'); INSERT INTO item (parent_id, name) VALUES (null, 'item8'); DROP PROCEDURE IF EXISTS UPDATE_LEVEL; DELIMITER // CREATE PROCEDURE UPDATE_LEVEL() BEGIN DECLARE CNT INT; DECLARE LVL INT; SET LVL=1; UPDATE item SET level=0; UPDATE item SET level=LVL WHERE parent_id IS NULL; SELECT COUNT(*) INTO CNT FROM item WHERE level=LVL; WHILE CNT>0 DO UPDATE item INNER JOIN (SELECT id FROM item WHERE level=LVL) as temp ON parent_id=temp.id SET item.level=LVL+1; SET LVL=LVL+1; SELECT COUNT(*) INTO CNT FROM item WHERE level=LVL; END WHILE; END // DELIMITER ; DROP TRIGGER IF EXISTS TRG_INSERT_ITEM; DELIMITER // CREATE TRIGGER TRG_INSERT_ITEM AFTER INSERT ON item FOR EACH ROW BEGIN CALL UPDATE_LEVEL(); END; // DELIMITER ; itemテーブルにinsertした場合にトリガーでUPDATE_LEVEL()を実行するようにしているのですが、 実際に挿入すると、 >Can't update table 'item' in stored function/trigger because it is already used by statment which invoked this stored function/trigger . このようなエラーが出てしまいます・・・ UPDATE_LEVEL()にinsertらしき記述はないと思うのですが、 これはなぜこのようなエラーが出るのでしょうか?

    • ベストアンサー
    • MySQL
  • トリガーでできますか?

    Oracle9iを使用しています。 プログラムにはどう探しても記述がないはずなのですが、いつの間にか数件のデータが消えているという現象が起きました。(数回発生) どこから、どういうSQL文が実行されているのかが知りたいのですが、トリガーでdelete文が実行される直前(または直後)にこのSQL文を抜き取る事は可能ですか? また同時に、実行されているマシン名、ユーザ名、時間等も取れるといいのですが。 既出かもしれませんが、探し出せなかったので質問させていただきました。 よろしくお願いします。

  • トリガーってなんですか?

    取引を始めたばかりです。 注文の時にトリガーの設定とありますが、トリガーの意味がよくわかりません。 FXをやっていたのですが、トリガーはありませんでした。 トリガーの必要性とゆうか、意味はなんでしょうか? あと 板にぶつけるってことは、指値とは違うんでしょうか? よろしくお願い致します。