あなたの物理的なデータモデルを作成する

ALTER TABLEのにOrderItem追加制約FK__OrderItem_SalesOrderのFOREIGN KEY(SalesOrderIDを)を参照SalesOrderの(SalesOrderIDを)でON DELETE CASCADE
  

なぜ、このステートメントは、宣言参照整合性制約と呼ばれる何ですか?これは、テーブルの定義自体の一部として、実行可能なコンピュータコードの別の作品のような動作を実装することに反対して、テーブルの参照整合性の動作を宣言します。我々はこのDRIは制約を打破し、各フレーズの意味を見て、次のように開始:

ALTER TABLEのにOrderItem追加制約FK__OrderItem_SalesOrder

上記のフレーズは、制約を追加するFK__OrderItem_SalesOrder名前付きオブジェクトにOrderItem子テーブルの定義を変更します。次のように、このオブジェクトは、制約の実際の命令を構成するコードの残りの3行が含まれます:

のFOREIGN KEY(SalesOrderIDを)を参照SalesOrderの(SalesOrderIDを)

このフレーズは、"肉とは、DRI制約のジャガイモ"です。これは、外部キーOrderItem.SalesOrderIDし、主キーSalesOrderの間の制限を作成します。SalesOrderIDをように、すべての値をOrderItem.SalesOrderID、SalesOrder.SalesOrderIDでは、とOrderItem.SalesOrderIDと一致することができます格納する必要が等しい値に格納されます。それ以外の値OrderItem.SalesOrderIDで試行されると、データベースはエラーをスローする試みが失敗、最後には、DRI制約の最後の行は以下のとおり:

ON DELETE CASCADEが

この行は、最初に、すべてにOrderItem行については削除されるSalesOrderの行に関連する削除するには、データベースに指示します。このDRIは制約の中では、ON DELETE CASCADE句は、関連にOrderItemの行でエラーをスローするSalesOrderの行を削除しようとし、なければ何も変更のいずれかのテーブルの内容にされるだろう。制約のコードの最初の4行は、標準のDRIの構文でサポートされてほとんどのデータベースプラットフォーム。 SQL Server 2000では、およびOracle 9iなどのデータベースの一部のプラットフォームでは、基本的なのDRIの構文に、これらのカスケード削除を容易にするためにON DELETE CASCADEの拡張子をサポートします。データベースのプラットフォームについては、カスケード接続の動作を削除するコードは、自動的にユーザーSalesOrderの行を削除しようとすると実行される別の曲を使用して実装する必要がありますDRI制約のカスケード削除をサポートしていません。コードを自動的にトリガが呼び出され実行中のこのような作品。徹底的に保存トリガについては、我々は彼らが何かの基礎をカバーするためにどのようにここにそうすることは対照することができますDRI制約に比較する作業が必要です。まず第一に、なぜ彼らと呼ばれているトリガ?答えは1つの実行"のトリガー"データベースイベント(のINSERT、UPDATE、またはDELETE)によってです。トリガは、特定のテーブルに接続されて自動的に1つまたは複数の特定のデータベースイベントは、テーブルの上の場所を実行するように指示されます。任意のSQLコードだけについてはしたいときにトリガには、コードを含むの内容を変更する場所が他のテーブルに、例えば、次の句:ください

ON DELETE CASCADEが

もしトリガとして実装され、前述の句は、次のコードになります:

= @列数@ = 0戻りDELETEのにOrderItemからにOrderItemチャンネル、のWHERE ch.SalesOrderIDエンド= deleted.SalesOrderID削除のIF行数@ SalesOrderのDELETEのように開始のDECLARE列@列数intのSELECT @のオンCREATE TRIGGERをtD_SalesOrder

今何このコードで起こっているのを打破する。まず、スタートトリガヘッダです。このヘッダーの両方のトリガを作成し、特定のテーブルにアタッチし、また、イベントやイベントが発生しますが、次のように指定します:

SalesOrderのDELETEのAS用のオンCREATE TRIGGERをtD_SalesOrder

言い換えれば、あなたSalesOrderのテーブルtD_SalesOrderという名前のトリガーを作成している、とするたびに、DELETEイベントSalesOrderのテーブルの上に発生する実行することを指示しています。これまでのところはいいですね。今は、トリガーの本体を見て、実際に実行され、一部は次のとおり:

のBEGINのDECLARE列@列数intのSELECT = @列数= 0戻り@のIF行数@

あなたがしてすぐに、BEGINでは、コードブロックを開始するタイプのローカル変数を宣言する整数列@名前。この変数は、SalesOrderの表は、DELETEイベントによって影響を受ける行のカウントを保持します。 @ @行数は、データベースサーバーによって制御されているグローバル変数は、常に行をテーブルのほとんどは最近、このケースではSalesOrderのテーブルが現在実行中のコードによって変更で影響を受けるのカウントが含まれます。だから列@ =あなただけでは宣言されたローカル変数にSalesOrderのテーブルからの行数の場所削除された行の数はSELECT @ @。場合、影響を受ける行の数がゼロの場合、トリガのコードが正常には、RETURNステートメントを使用して、終了し、さらに発生するもの。この返りテストでは、トリガのコード内に存在しない場合は、トリガのコードの残りを実行し、場合がある子行が関連しているので、場合にのみ実行する必要のあるコードを実行されるだろうことが起こる必要はありません。今実際に連鎖削除を実行するトリガの一環として、を次のとおり:

DELETEのにOrderItemからにOrderItemチャンネル、のWHERE ch.SalesOrderIDエンド= deleted.SalesOrderID削除

このリレーショナル削除本質は、削除されたpseudotable - inは、内のすべての行に関連しているにOrderItemの表に、これらの行を削除すると、すべてにOrderItem行SalesOrderの行が削除に関連する最後に、ENDを使って、トリガの本体を閉じます。トリガーは非常にある様々なデータベースプラットフォーム上でさまざまな機能。我々だけで議論トリガは、例えば、これは、ステートメントレベルのイベントを定義するSQL Server 2000のプラットフォームで、このトリガごとに1回のDELETEステートメントは、テーブル上で実行すると、どのように多数の行が影響を受けていないことについては火災の意味で動作その文。比較すると、Oracleは、ステートメントレベルのいずれかで、SQL Server、または行レベルで、このようなことは、トリガのコードを1回では、ステートメントによって影響を受けて、個々の行に対して実行するように動作することがトリガされます。データベースプラットフォーム間でのもう一つの区別ときに火をすることができますトリガされます。イベント終了後のステートメントによって変更される場所と、すべての値をとるSQL Serverの火災(ただし、前には、ディスク)にコミットされます。オラクルのいずれかを前に、またはかかる場所は、イベントの後に実行するためのトリガを定義できるようにトリガされます。その他の違いも存在する。そのときDRI制約を使用して、参照整合性を実装するときに使うのですかトリガ?まあ、DRIを制約と同等の操作をトリガで実装するよりも実行するために、ほとんど常に高速化され、彼らは確かにコードを簡単にされますが、あなたも関与することが、より複雑なロジックが必要かもしれませんが、そのためには、使用する必要がトリガされます。

を自動的に行をテーブルに挿入すると、デフォルト値を供給する例を何回も、現在の日付と販売の時間、または、いくつかのビジネスプロセス内のポイントの先頭を表すステータス値を返します。この現象は、デフォルトのデフォルト値を使用して、特定のテーブルの列に定義されて実装されて、彼らは、"この列はこのテーブルに対してINSERTステートメントを、先に行く、自動的にこのデフォルト値を入力に含まれていない場合はあなたのデータベースを教えてください。場合は、INSERTステートメントは次の列で、どのような値を使用含まれていませんがのために提供されました。"ここにどのようにデフォルトの宣言は、テーブル定義の中に見えるの:

のCREATE TABLE SalesOrderの(SalesOrderIDをintのIDENTITY(1,1)、は、CustomerNumberデータ型はvarchar(12)は、NULL SaleDate datetime型のDEFAULT getdate()のがNOT NULL、 制約PK_SalesOrder PRIMARY KEYを非クラスタ化インデックス(SalesOrderIDを))

この記事は、全体に気付くでしょうそのコードの我々は太字の部分。これは、我々のトピックについて議論する""木を見て森を助けるためのシンプルで効果的なメカニズムです。例えば、議論のデフォルトを迅速に議論の中での残りの部分に気を取られることなく、コードの中で最も該当する部分を取得することができますコードのブロック内には、DEFAULT句を強調。自動的にSQL ServerのGETDATE関数の結果を()関数の場所これは、デフォルトの宣言現在の日付と時間のSaleDate列限りSaleDateの列には、INSERTステートメントの一部ではありません。場合は、SaleDate列は、INSERT文の一部である場合、値は、ステートメントによって指定された使用されます。

記事リンダヘイスティングス提出


免責事項:弊社のウェブサイトは、この資料の内容については責任を負いません。 Webarticles無料の情報リソースです。
重要: この記事は、"あなたの物理的なデータモデルの作成"を自動ソフトウェアによって翻訳された。大変申し訳ございませんが発生した可能性があります任意のスペルミスを感じている。お客様のご理解いただき、ありがとうございます。


Online: 247 users browsing the articles directory