==[[SQL Server ストアド プロシージャ 基本]]==
[[SQL Server]] | [[SQL Server 2005]] | [[SQL Server ストアド プロシージャ]] | [[Transact-SQL]] |
*http://msdn.microsoft.com/ja-jp/library/ms190782(v=[[SQL]].90).aspx
==基本==
===可能なこと===
*参照するオブジェクトに対する直接的な権限がユーザーになくても、ストアド プロシージャを実行する権限をユーザーに許可することができる
*セキュリティの向上
**パラメータ化されたストアド プロシージャは、SQL プロシージャは、[[SQL]] Injection 攻撃からアプリケーションを保護するうえで有効
*モジュール プログラミングが可能です。
**一度プロシージャを作成すれば、プログラム中で何度でも呼び出せます。
**間接指定が可能になり、コードの拡張が容易
*ネットワーク トラフィックが減少します。
**数百行の [[Transact-SQL ]] コードをネットワークに送信するのではなく、プロシージャ内のコードを実行する 1 つのステートメントを使用することで、数百行のコードが必要な処理を実行できます。
==種類==
===ユーザー定義ストアド プロシージャ===
====可能なこと====
*入力パラメータを受け取ること、表形式かスカラ値の結果とメッセージをクライアントに返す
*DDL (データ定義言語データ定義[[言語]]) ステートメントおよび DML (データ操作言語データ操作[[言語]]) ステートメントを呼び出す
*出力パラメータを返す
====2種類のストアドプロシージャ====
=====[[Transact-SQL]]=====*ransact-[[SQL ]] ステートメントをまとめて、ユーザーが指定したパラメータを受け取ったり返したりできるようにして保存したもの
=====[http://msdn.microsoft.com/ja-jp/library/ms131094(v=SQL.90).aspx CLR]=====
*ユーザーが入力したパラメータを取得したり返したりできる Microsoft [[.NET ]] Framework の CLR (共通言語ランタイム) メソッドへの参照*[[.NET ]] Framework アセンブリのクラスの静的パブリック メソッドとして実装
===拡張ストアド プロシージャ===
*拡張ストアド プロシージャを使用すると、C などのプログラミング言語で独自の外部ルーチンを作成できるなどのプログラミング[[言語]]で独自の外部ルーチンを作成できる*DLL なので、Microsoft [[SQL Server ]] インスタンスで動的に読み込んで実行<blockquote>この機能は、将来のバージョンの Microsoft [[SQL Server ]] では削除される予定。代わりに、「CLR (共通言語ランタイム) 統合の概要」を使用すること。</blockquote>
===[http://msdn.microsoft.com/ja-jp/library/ms187961(v=SQL.90).aspx システム ストアド プロシージャ]===
*管理作業の多くは、システム ストアド プロシージャと呼ばれる特殊なプロシージャにより実行
*システム ストアド プロシージャは Resource [[R]]esource データベースが物理的な保存場所で、sp_ というプレフィックスが付きます
==設計==
<blockquote>バッチとして記述できる [[Transact-SQL ]] コードはほぼすべて、ストアド プロシージャの作成に使用できます</blockquote>
===規則===
*他のデータベース オブジェクトを作成できます。
*ローカルな一時テーブルを作成した場合は、そのストアド プロシージャのためだけに存在するため、終了すると使用できなくなります。
*ストアド プロシージャから、呼び出されたストアド プロシージャは、呼び出し元が作成した、すべてのオブジェクトにアクセスできます。
*リモート インスタンス上で変更を行うリモート ストアド プロシージャを実行した場合は、それらの変更はロールバックできません。リモート ストアド プロシージャはトランザクションにはかかわりません。プロシージャは[[トランザクション]]にはかかわりません。
*パラメータの最大数は 2100 です。
*ローカル変数の最大数は、使用可能なメモリ量によってのみ制限されます。
!_
|-
|CREATE AGGREGATEC[[R]]EATE AGG[[R]]EGATE|CREATE RULEC[[R]]EATE [[R]]ULE|CREATE C[[R]]EATE DEFAULT|CREATE C[[R]]EATE SCHEMA
|-
|CREATE FUNCTION または ALTER FUNCTION
|CREATE TRIGGER または ALTER TRIGGER
|CREATE PROCEDURE または ALTER PROCEDURE
|CREATE VIEW V[[IE]]W または ALTER VIEWV[[IE]]W
|-
|SET PARSEONLY
|SET SHOWPLAN_ALL
|SET SHOWPLAN_TEXT
|SET SHOWPLAN_XMLSHOWPLAN_[[XML]]
|-
|USE database_name
===名前の修飾===
*スキーマにより修飾されていないオブジェクト名使用される場合、既定ではこの名前はストアド プロシージャのスキーマになります。
*他のユーザーが使用するには、すべての DDL (データ定義言語データ定義[[言語]]) ステートメントで使用するオブジェクト名を、スキーマの名前で修飾することにより、名前が確実に同じオブジェクトに解決されます。
<blockquote>スキーマ名が指定されていないと、このオブジェクト名を、まず、プロシージャを呼び出したユーザーまたは EXECUTE AS 句に指定されているユーザーの既定のスキーマを使用し、次に dbo スキーマを使用して解決しようとします</blockquote>