H30午後Ⅰ問2 設2 NO ACTIONについて

にゃんさん  
(No.1)
H30 午後Ⅰ 問2 参照制約 NO ACTIONの記載について、納得ができない部分があります。
当方の理解不足かとは思いますが、どなたかご教示いただけませんでしょうか。

問題文では参照制約の定義として「NO ACTION:参照先のテーブルの行を削除または更新したとき、参照元のテーブルの行に対して何もしない」と記載がありますが、
正しくは、「NO ACTIONは参照先のテーブルの行を削除または更新できない」ではないでしょうか。

実際、(1)(b)では参照先の削除時にNO ACTION検査制約のためにエラーとなる旨の回答を求められています。

これでは誤記と言われても仕方がないのでは、と思ってしまいます。。。
もしくは、削除/更新の段階ではNO ACTIONでは何もしないが、その状態に対し、その後の検査契機モードで制約を検査してエラーにする、ということなのでしょうか。

どなたかご教示をいただけますでしょうか。
2021.10.05 12:43
GinSanaさん 
DB ゴールドマイスター
(No.2)
この投稿は投稿者により削除されました。(2021.10.06 07:56)
2021.10.06 07:56
GinSanaさん 
DB ゴールドマイスター
(No.3)
NO ACTIONは「削除/更新」の際に当該行を参照する行の削除を拒否する  がいいでしょうかね。問題といてるときはあんまり違和感を覚えはしませんでしたが、正確に書くならそうでしょうかね。
NO ACTIONの場合、DBMSによって反応タイミングを変えられる(文単位ではなく、トランザクション単位の判定タイミングにできる。これを遅延制約という。例:Oracle、Postgres)場合とそうでない場合がある(例:MySQL)ので、本当はRESTRICTにしとけといいたいところではありますね。DB依存でそういう設定をしていないと書いていないのなら、結構ややこしい立て付けの問題になるとは思います。
NO ACTIONは標準SQLの範疇でRESTRICTは・・・とも思いましたが、どっちも標準SQLですからねえ。なおさら遅延制約は使わないことを書いとけよ、とは思います。書いたからどうだ、と言われればそうなんですが。

2021.10.06 07:55
にゃんさん  
(No.4)
ご回答いただきありがとうございます。
遅延制約については、以下のような記載があるのですがこれが該当するということでしょうか。

=====問題文より抜粋==================
1.参照制約
(1)挙動モード
①NO ACTION:参照先のテーブルの行を削除または更新したとき、参照元のテーブルの行に対して何もしない。
①CASCADE:参照先のテーブルの行を削除または更新したとき、参照元のテーブルの行にも削除または更新を連鎖させる。

(2)検査契機モード
①即時モード:SQL実行終了ごとに、対象となるすべての行の実行結果に対して、制約を検査する。
②猶予モード:トランザクション数量時に、トランザクション内のすべてのSQLを実行した結果に対して、制約を検査する。
=======================

遅延制約については不勉強ながら初めて知った概念のため、解答時には字面通りに解釈するしかなかったのですが、知識としては以下2点を抑えていれば別段不自然ではない、ということでしょうか。
(a) NO ACTIONとは何か(というより、題中でNO ACTIONを違う意味で使用されることは無い)
(b) 遅延制約とは何か
2021.10.07 01:03
GinSanaさん 
DB ゴールドマイスター
(No.5)
ああ、その記載がありましたね。その記載があることを忘れてました
そうなると、DBSPもこういうベンダ依存の部分がある・・・と思いましたが、たまたまMySQLがANSI標準からずれてるのかもしれません
2021.10.07 06:48
にゃんさん  
(No.6)
ありがとうございます。
別年度を解いていたらRESTRICTも出てきたので、問題中でRDBMSの仕様として定義する、というだけのかもしれません。

おかげ様でスッキリして試験を迎えられます。ありがとうございました!!
2021.10.09 17:17

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。

その他のスレッド


Pagetop