2017-05-19 5 views
0

私が作ったプログラムを使ってデータベースを操作しようとしているのですが、まだわかりません。新しい行を挿入するためのストアドプロシージャを書くべきかどうか。ストアドプロシージャを使用してINSERTする場合

First_Table

name_code varchar(10) primary key, 
date_ka datetime not null, 
amount int not null 

Second_table

​​

私は、主キーは、実際に最初のテーブルに存在している場合、私がチェックできるように挿入するために、第2のテーブルのためのストアドプロシージャを使用する必要があると思われるもの私が間違っているなら私を訂正してください。そのためFirst_Tableに存在しないname_codeの値を挿入しようとしたときにエラーになるだろう、外部キーcontstraintの

+1

通常、このチェックは行わないでください.SQL Serverはそれを実行します –

+0

私はそれを理解していますが、spは必要ありません。 –

+1

ストアドプロシージャは、いくつかの異なる要因によって異なります。 SQL内で1回のショットで多くのレコードを挿入しようとすると、おそらくストアド・プロシージャが機能します。あなたがエラーを処理できる何らかの管理コード(.NET、Javaなど)を使用できるのであれば、それは必要ではありません。私は、SQLでの通常のエラー処理でもできることがあると確信していますが、あなたが質問で与えたものとは話すことは不可能です。 – krillgar

答えて

0

FOREIGN KEY制約 「FK_Key」と競合INSERT文。競合はデータベース "YourDatabaseName"、テーブル "dbo.First_Table"、列 'name_code'で発生しました。 ステートメントが終了しました。

この場合、Second_tableに行が挿入されません。

+0

つまり、ストアドプロシージャを使用する必要はありません。 –

+0

利用可能な情報:いいえ – fni

+0

2番目のテーブルの主キーが「デフォルト」であることを忘れてしまいました。私はあなたが与えた例のように挿入に失敗した場合、私が挿入していないにもかかわらず、それだけで増加するだろうと信じていますか?だから私はチェックし、挿入しないためにSPが必要ですか? –

3

個人的には、単純なselect文でも、すべての処理を停止した手順で行うのが好きです。このアプローチには、次のような多くの利点があります。

  1. セキュリティ。アプリケーションのユーザーは、テーブルに直接アクセスすることはなく、ストアドプロシージャにしかアクセスできません。
  2. カプセル化。アプリケーションはテーブルの構造を知る必要はありません。ストアドプロシージャのみを処理するため、ストアドプロシージャのパラメータと出力を知る必要があります。
  3. 簡単な操作(2から派生)。ストアドプロシージャのパラメータと出力が変わらない限り、データベースレベルで何かを変更する必要がある場合は、再コンパイルする必要はありません。
+1

また、テスト目的のために、tsqltを使用してチェックイン時にSPを自動テストすることができます。 – SAS

関連する問題