-1


0

トリガーのために以下のコードを誰かに説明できますか?上記のコードは私のクラスメートの一人によって書かれたものであり、その中の何も理解できません。

理解できません。

同じタスクを実行する他の方法があればまた私に知らせてください。

開始として挿入するための[dbo]。[BOOKISSUEDDETAILS]のCREATEトリガー[dbo]。[trg_InsertInBookIssuedDetails]

トランを始める

更新ナース・セットnur.NumberOfBooksIssued = nur.NumberOfBooksIssued 1から新規メンバーnur内部にiが挿入されました

存在する場合(LIBRARYBOOKDETAILS lbd INIER JOIN INSERTED IN ON i.BookID = lbd.Inventory <= 1)からraiserror( '利用不可または3冊以上の本を発行できない'、16、-1)を選択終わり

それ以外の場合は、更新を開始します。lbd set lbd.Inventory = lbd.Inventory  -  1 LIBRARYBOOKDETAILSからlbd内部結合されたi lbd.BookID = i.BookID

終了をコミット

終わり

上記のトリガーステートメントを理解するのを手伝ってください。

前もって感謝します!

4 Answer


0


誰かがBookIssuedDetailsテーブルに行を挿入したときにアクティブになるトリガーです。 「各行について」などのことは言及されていないので、挿入が複数の行(おそらく1行だけを含む)に対して行われた後に1回実行されると思います。 ステートメントに対して行が挿入されないため、INSERT INTO BookIssuedDetailsのSELECT * FROM Somewhere WHERE 1 = 0の場合に何が起こるかを説明するのは興味深いです。

発行された書籍を記録するためにNewMemberテーブルを更新します。 'INSERTED’キーワードは、 'BookIssuedDetailsテーブルに挿入されたレコード’とほぼ同等のエイリアスです。

また、LibraryBookDetailsをチェックして誤解を招くようなエラーメッセージを生成します(ITでは伝統的です) - このライブラリメンバーに発行された本の数をチェックしません。 LibraryBookDetailsが、利用可能な本があることを示している場合は、テーブルを更新して、利用可能な特定の本の数を減らします。

すべて教育を受けた推測作業。


0


これが簡単な内訳です

データベースに[dbo]が所有する[BOOKISSUEDDETAILS]というテーブルがあります。

このテーブルには、[dbo]が所有する[trg_InsertInBookIssuedDetails]というトリガーがあります。 このトリガーは、行がテーブルに挿入されるたびに発生します。

トランザクションを開始します(簡単に言うと、Transactionは複数の行を1つの単位として実行する機能です - allかnone)。

行が挿入されると、booksが発行されたことになるので、このトリガーはNEWMEMBERテーブルの行を更新します。

この書籍のエントリがLIBRARYBOOKDETAILSに存在しない場合、トランザクションはロールバックされ、NEWMEMBERテーブルは変更されません。

本が存在する場合、LIBRARY BOOK DETAILSの在庫数を1減らします。

コードの一部だけを貼り付けたようです。 この意見にはEND文とCOMMIT文があるはずです。

そうは言っても、SQLは読みやすく理解しやすいものであると言わなければなりません。これが宿題で、頻繁にこのようなことをしなければならない場合は、T-SQL入門書を読んで理解してください。


0


最初はバグがあります。

INSERTEDテーブルは( `BOOKISSUEDETAILS`に)挿入されているすべての行の擬似テーブルです。

メンバーに発行される本の数を増やす(複数回UPDATEするのでINSERTEDに複数の行が含まれる場合、これはバグだと思います - これが信頼できるかどうかわからない)本の在庫 最初に棚に2冊以上のコピーがある本があるかどうかを確認します(これはバグだと思います)。在庫が1冊以下の場合はエラーになります。

いずれにせよ、それは図書館システムのための現実的な実装ではありません、それぞれの本はユニークなので、あなたの目録は常に1か0になるでしょう。


0


トリガはデータの完全性を維持するために使用されます。 はい、同じことがストアドプロシージャまたは動的なSQLを介しても実行できます。 ただし、コードをトリガーに入れることで、データがどのようにデータベースに取り込まれるかに関係なく、ルールに確実に従うようになります。 この場合、あなたがチェックアウトすることができる本の目録に影響を与えるので、引き金はこれのための最も良い場所です。

トリガーが、このインスタンスでその人に発行された本の数を別の表の積算合計に追加しているように思われる。

それからそれは本が在庫にあるかどうかそしてそれらがロールバックされていないかどうかを確認するためにトランザクション全体をチェックします。 (個人的に私は最初にチェックをしたい)。 それらが在庫にある場合は、その本がチェックアウトされているので在庫を1つ減らします。

あなたが見る一つのことは、トリガーがINSERTEDと呼ばれるテーブルを参照することです。 これ(およびDELETEDと呼ばれる類似の表)は、トリガーでのみ使用可能なデータの表です。 挿入されたばかりのデータが含まれています。

トリガーは、挿入された(またはトリガーに応じて更新または削除された)バッチごとに1回起動されます。 つまり、1つのレコードが挿入された場合、挿入されたテーブルには1つのレコードがあり、10,000レコードがバッチに挿入された場合は、挿入されたテーブルには10,000レコードが含まれます。 トリガーを設計する際には、この点に留意することが重要です。

あなたのデザインは多少欠陥があるようです。 他のメンバーには固有の名前がないため、メンバー名を使って参加することは絶対に避けてください。 最初のJohn Smithのレコードを2番目のJohn Smithのレコードと混同したくはありません。 名前は常に一意性を保証するために使用される代理IDを持つべきです。