• 締切済み

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

みんなの回答

  • kikaida-
  • ベストアンサー率69% (37/53)
回答No.1

テーブル2のキー設定はありますか。 どちらにしてもメッセージは気にしなくてもいいです。 そんなものだったような気がします。 またSQLですが上記のものは以下のように簡素化できます。 delete from テーブル2 where 列1= (select 列1 from deleted)

BuXiangHua
質問者

お礼

コメントありがとうございます。 > テーブル2のキー設定はありますか。 キーとは、Primaryキーのことでしょうか? 一時テーブルではありませんので、当然あります。 テーブル1 = 親 テーブル2 = 子 で、テーブル1と2のレコードは1:Nの関係です。 > どちらにしてもメッセージは気にしなくてもいいです。 > そんなものだったような気がします。 私は気にしませんが、使う人に気にするな、と強要することはできません。 結局、この仕様は止めました。 もともと、このトリガは親/子レコードの整合性を保つためでしかないので、子レコードがある間は、親レコードの削除を禁止 (アプリケーションで) すればよい、と判断しました。 ありがとうございました。

関連するQ&A

  • トリガからプロシージャのコールについて

    データベースはOracle10gです。 あるテーブルAにレコードが登録されたタイミングで、 別のテーブルBにレコードを登録するトリガを作成しようとしています。 トリガ内に全ての処理を記述するとかなりの行数になりそうなので、 登録のプロシージャを作成し、トリガからコールしようと考えています。 Aに登録されたレコードのカラムの一部を、Bに登録するレコードでも使用したいのですが、 プロシージャに引数として渡す際、 使用したいカラムを一つずつ指定しなければならないのでしょうか? (使用したいカラムは10ほどあります。) トリガに 「REFERENCING NEW ROW R1」と記述して、 このR1を渡すことはできないのでしょうか?

  • 削除時のトリガについて

    レコードの更新時にトリガで処理履歴を履歴テーブルにとりたいのですが、 元のレコードに処理端末「Environ("COMPUTERNAME")」で取得している)と言う 項目があるので、登録時と訂正時は inserted を使うので処理履歴に どのPCで処理したか記録が残るのですが、削除時は deleted を使うと 削除されたデータの記録になるので、削除の前に処理したPCになってしまいます。 実際に削除したPC名にしたいので・・・ 現在は削除時のトリガを無効にして、元のレコードを削除するストアドに 処理端末を渡してそのストアドで履歴に追加しているのですが、 トリガ(もしくはSQL側)で呼び出したPC名は把握できないものでしょうか?

  • 【Access】先頭2文字が条件に該当するレコードを削除する方法について

    下記のテーブルがある場合、下記のSQL文を実行すると、 3200~3299のレコードが削除されました。 これを3000~3999のレコードを削除するようにすれば宜しいでしょうか? なおSQL文の「3200」の箇所に「32000」と入力した際は、 32000~32999のレコードを削除したいと思います。 【SQL文】 DELETE * FROM TABLE WHERE key Like Left(3200,2) & '*' 【テーブル(TABLE)の中身】 key 3000 ~ 3999 30000 ~ 39999 ちなみにテーブルのkey列は数値型のため、数値の前に0を付加する事はできませんでした (なお文字列型に変更する事は出来ません)。 「WHERE key Like Left(3200,2) & '*'」を変更すれば解決するかと思いますが、 どのように記述すればよいか思いつきませんでした。 その為、何か良い手をご存知の方がいらっしゃいましたら、アドバイスをいただければと思います。 よろしくお願いします。

  • Access2000 実行時エラー '3061':

    Access2000(初心者) 下記コードを実行すると実行時エラー '3061': パラメータが少なすぎます。1を指定してください。と出ます。 ※検索したレコードの削除(日付) CurrentDb.Execute "DELETE * FROM テーブル名 WHERE ((([テーブル名].[日付]) Between #2009/01/01# And テキスト名)); " テキスト名に入力されているデータがおかしいのでしょうか? Me.テキスト名 = DateSerial(Format(Date, "yyyy"), Format(Date, "mm")-1, Format(Date, "dd")) 御教授願います。

  • SSIS 変数の値をSQL実行タスクで使用する方法

    みなさま初めまして。 SSISの変数利用について教えて頂きたく、何卒宜しく願いいたします。 現在、SSISの変数に入った値をSQL実行タスクで実行(正確には、変数の値を含むレコードを削除)したく、他スレッドを参考にし、下記設定を行おうとしたのですが、エラーが出力され登録が出来ません。。 SQL実行タスク ->左メニューより、「式」を選択 ->Expressionsにて、SqlStatementSourceを選択 ->下記式を記述 ----------------------------- DELETE FROM [tblTesttable] WHERE TIMEID = @[User::valtime] ----------------------------- 行いたいことは、テーブル(tblTesttable)から、項目TIMEIDの値がユーザ変数(valtime)と同じレコードを削除するという内容です。 上記式を記述し、「式の評価」を行うと、下記エラーが出力されてしまいます。。。 ------------------------------------------------------ 式"DELETE FROM [tblTesttable] WHERE TIMEID = @[User::valtime]"を解析できませんでした。この式には無効なトークン、不完全なトークン、または無効な要素が含まれている可能性があります。また適切な形式でないか、かっこなどの必要な要素の一部が不足している可能性があります。 ------------------------------------------------------- SSISについて初心者であり、ネットや本でいろいろ探しているのですがなかなかうまくいかず。。。 大変お手数ですが、どなたか教えて頂けますと大変に助かります。 どうか宜しくお願い致します。

  • SQL Server INSERTのトリガで採番

    データINSERT時にトリガを使い主キーを 採番したいのですが、少々コーディングに 困っていてます。 わかる方どうぞ、助言をお願いします。 主キー yyyymm+n(5) 採番したまではよかったのですが、 INSTEADテーブル(トリガのバッファテーブル?)の 主キーのフィールドに 格納する方法がわかりません。 どうもORACLEと記述方法がまるで違うので かなり苦戦しています。 テーブルが確定してるので現状の フィールドレイアウトやデータ体系を変更することは できません。よろしくお願いします。

  • 実行時エラー3086 削除クエリができない

    アクセスでvbaでアクションクエリを実行しようとしたら、エラーになりました。 エラー内容は 「指定されたテーブルから削除できませんでした。(エラー 3086)」 です。 コードは mySQL = "DELETE Tフォルダ名.* FROM Tフォルダ名;" DoCmd.RunSQL mySQL です。 今まで問題なく使えていたのにいきなりダメになりました。 テーブル名もフィールド名も存在するし、データも入っています。

  • すべてのテーブルのすべてのレコードを削除する方法

    データベースを扱うプログラムに対してユニットテストを行いたいと思っています。 それぞれのテストが終了するごとにすべてのテーブル内のすべてのレコードを削除したいのですが、 delete from table_a; delete from table_b; delete from table_c; ... のように書くと、外部キー制約に引っかかってしまい削除できないことがあります。 短いSQL文で複数のテーブル内のレコードをすべて削除する方法はないのでしょうか? よろしくお願いします。 ちなみに、私が現在使っているDBMSはPostgreSQL 8.1です。

  • 実行時エラー3251

    今まで問題なくできていたのですが エクセルのvbaのADOでアクセスにレコードを追加していました。 なんだか今日いきなりエラーになりました。 エラー内容は 実行時エラー3251 現在のRecordsetは更新をサポートしていません。 プロバイダ―か、選択されたロックタイプの限界の可能性があります です。 発生したコードは rs("不可") = エラー文字列 です。 要するに、今までは更新できるテーブルだったけど 何かの拍子で更新できないテーブルになってしまったから エラーになったのでしょうか?

  • ACCESSで指定されたテーブルから削除できませんでしたとエラー

    お世話になります。 似たような問題をググッてみたのですが、イマイチ解決に繋がらず、 最終手段と質問させて頂きました。 現在、ACCESS2007で削除クエリを作成していますが、 題名のエラーが表示されてしまいます。 ・テーブルAとBが存在します。 ・テーブルBのレコードを削除したいです。 ・削除条件は、テーブルAでSELECTした結果に対し、  テーブルAとテーブルBで一致するものを削除します。 ・A/B両テーブルともに主キーは設定されていません。 ・また、リレーションも張っていません。 ・データシートビューは想定したものが表示されます ・作成したSQLは以下のような感じです。 --------------------------------------------------- DELETE T2.* FROM T2, ( SELECT * FROM T1 WHERE T1.Fld1 = "01" AND T1.Fld2 = "002" AND T1.Fld3 BETWEEN #2008/4/1# AND #2009/3/31# AND (T1.Fld4 ="A" OR T1.Fld5 = "B") ) AS T1a WHERE T2.Fld1 = T1a.Fld1 AND T2.Fld2 = T1a.Fld2 AND T2.Fld3 = T1a.Fld3 --------------------------------------------------- 以上、解決策を伝授頂けないでしょうか? よろしくお願いします。