ALTER PROCEDURE (Transact-SQL)
CREATE PROCEDURE ステートメントを使用して作成した既存のプロシージャを変更します。 ALTER PROCEDURE では権限は変更されず、従属ストアド プロシージャまたはトリガーに影響することはありませんが、 QUOTED_IDENTIFIER と ANSI_NULLS の現在のセッション設定は、変更時にストアド プロシージャに取り込まれます。 ストアド プロシージャの最初の作成時に有効であった設定と変更後の設定が異なる場合、ストアド プロシージャの動作が変わる可能性があります。
構文
--Transact-SQL Stored Procedure Syntax
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]
] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]
<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE AS Clause ]
--CLR Stored Procedure Syntax
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ]
[ { @parameter [ type_schema_name. ] data_type }
[ = default ] [ OUT | OUTPUT ] [READONLY]
] [ ,...n ]
[ WITH EXECUTE AS Clause ]
AS { EXTERNAL NAME assembly_name.class_name.method_name }
[;]
引数
schema_name
プロシージャが属するスキーマの名前を指定します。procedure_name
変更するプロシージャの名前を指定します。 プロシージャ名は、識別子の規則に従っている必要があります。**;**number
同じ名前のプロシージャをグループ化するために使用する既存の整数を指定します (省略可能)。グループ化されたプロシージャは、DROP PROCEDURE ステートメントを使用して一度に削除できます。注意 この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。 新しい開発作業では、この機能の使用を避け、現在この機能を使用しているアプリケーションは修正するようにしてください。
**@**parameter
プロシージャ内のパラメーターを指定します。 パラメーターは 2,100 個まで指定できます。[ type_schema_name**.** ] data_type
パラメーターのデータ型とそれが属するスキーマを指定します。データ型の制約については、「CREATE PROCEDURE (Transact-SQL)」を参照してください。
VARYING
出力パラメーターとしてサポートされている結果セットを指定します。 このパラメーターはストアド プロシージャによって動的に作成され、その内容は変化します。 カーソル パラメーターにのみ適用されます。default
パラメーターの既定値です。OUT | OUTPUT
パラメーターが戻りパラメーターであることを示します。READONLY
パラメーターをプロシージャの本体内で更新または変更できないことを示します。 パラメーターの型がテーブル値型の場合は、READONLY を指定する必要があります。RECOMPILE
SQL Server 2005 データベース エンジンでは、このプロシージャ用のプランをキャッシュせず、実行時にプロシージャを再コンパイルします。ENCRYPTION
データベース エンジンで、ALTER PROCEDURE ステートメントの元のテキストを、暗号化した形式に変換することを示します。 暗号化した形式の出力は、SQL Server 2005 内のどのカタログ ビューでも直接見ることはできません。 システム テーブルまたはデータベース ファイルへのアクセス権を持たないユーザーは、暗号化した形式のテキストを取得できません。 DAC ポート経由でシステム テーブルにアクセスする権限、または直接データベース ファイルにアクセスする権限を持っているユーザーは、このテキストを使用できます。 また、サーバー プロセスにデバッガーをアタッチできるユーザーは、実行時、元のプロシージャをメモリから取得できます。 システム メタデータへのアクセスの詳細については、「メタデータ表示の構成」を参照してください。このオプションを使って作成したプロシージャを、SQL Server レプリケーションの一部として発行することはできません。
このオプションは、共通言語ランタイム (CLR) のストアド プロシージャには指定できません。
注意 データベース エンジンでは、アップグレード中に、sys.sql_modules に格納されている暗号化コメントにより、プロシージャが再作成されます。
EXECUTE AS
アクセス後にストアド プロシージャを実行するセキュリティ コンテキストを指定します。詳細については、「EXECUTE AS 句 (Transact-SQL)」を参照してください。
FOR REPLICATION
レプリケーション用に作成したストアド プロシージャは、サブスクライバーでは実行できないことを示します。 FOR REPLICATION オプションを指定して作成したストアド プロシージャは、ストアド プロシージャ フィルターとして使用され、レプリケーション時にのみ実行されます。 FOR REPLICATION を指定した場合、パラメーターは宣言できません。 RECOMPILE オプションは、FOR REPLICATION を使って作成されたプロシージャでは無視されます。AS
プロシージャが行う動作です。<sql_statement>
プロシージャに含まれる任意の数と種類の Transact-SQL ステートメントを指定します。 いくつかの制約があります。 詳細については、「CREATE PROCEDURE (Transact-SQL)」の「<sql_statement> の制限」を参照してください。EXTERNAL NAME assembly_name**.class_name.method_name
CLR ストアド プロシージャで参照する Microsoft.NET Framework アセンブリのメソッドを指定します。class_name は有効な SQL Server 識別子で、アセンブリ内にクラスとして存在する必要があります。 クラス名に名前空間とその区切り文字のピリオド (.) が含まれる場合は、クラス名をかっこ ([]) または引用符 (""**) で区切る必要があります。 指定するメソッドは、クラスの静的メソッドであることが必要です。注意 既定では、SQL Server で CLR コードを実行することはできません。 CLR モジュールを参照するデータベース オブジェクトを作成、変更、削除することはできませんが、これらの参照を SQL Server で実行するには、clr enabled option を有効にする必要があります。 このオプションを有効にするには、sp_configure を使用します。
説明
Transact-SQL ストアド プロシージャを CLR ストアド プロシージャに変更したり、その逆に変更することはできません。
詳細については、「CREATE PROCEDURE (Transact-SQL)」の「解説」を参照してください。
注意 |
---|
以前のプロシージャ定義が WITH ENCRYPTION または WITH RECOMPILE を使用して作成されている場合、これらのオプションは、ALTER PROCEDURE に指定されるときだけ有効になります。 |
権限
プロシージャに対する ALTER 権限が必要です。
例
次の例では、uspVendorAllInfo ストアド プロシージャを作成します。 このプロシージャは、Adventure Works Cycles を提供するすべてのベンダーの名前と、そのベンダーの提供製品、信用格付け、およびベンダーが現時点で製品を提供できるかどうかを返します。 このプロシージャを作成した後、別の結果セットを返すようプロシージャを変更します。
USE AdventureWorks;
GO
IF OBJECT_ID ( 'Purchasing.uspVendorAllInfo', 'P' ) IS NOT NULL
DROP PROCEDURE Purchasing.uspVendorAllInfo;
GO
CREATE PROCEDURE Purchasing.uspVendorAllInfo
WITH EXECUTE AS CALLER
AS
SET NOCOUNT ON;
SELECT v.Name AS Vendor, p.Name AS 'Product name',
v.CreditRating AS 'Credit Rating',
v.ActiveFlag AS Availability
FROM Purchasing.Vendor v
INNER JOIN Purchasing.ProductVendor pv
ON v.VendorID = pv.VendorID
INNER JOIN Production.Product p
ON pv.ProductID = p.ProductID
ORDER BY v.Name ASC;
GO
次の例では、uspVendorAllInfo ストアド プロシージャを変更し (EXECUTE AS オプションなし)、指定した製品を供給するベンダーだけを返します。 ここでは、LEFT 関数および CASE 関数を使用して、結果セットの表示をカスタマイズします。
ALTER PROCEDURE Purchasing.uspVendorAllInfo
@Product varchar(25)
AS
SELECT LEFT(v.Name, 25) AS Vendor, LEFT(p.Name, 25) AS 'Product name',
'Credit rating' = CASE v.CreditRating
WHEN 1 THEN 'Superior'
WHEN 2 THEN 'Excellent'
WHEN 3 THEN 'Above average'
WHEN 4 THEN 'Average'
WHEN 5 THEN 'Below average'
ELSE 'No rating'
END
, Availability = CASE v.ActiveFlag
WHEN 1 THEN 'Yes'
ELSE 'No'
END
FROM Purchasing.Vendor AS v
INNER JOIN Purchasing.ProductVendor AS pv
ON v.VendorID = pv.VendorID
INNER JOIN Production.Product AS p
ON pv.ProductID = p.ProductID
WHERE p.Name LIKE @Product
ORDER BY v.Name ASC;
GO
EXEC Purchasing.uspVendorAllInfo N'LL Crankarm';
GO
以下に結果セットを示します。
Vendor Product name Credit rating Availability
-------------------- ------------------- ------------- ------------
Proseware, Inc. LL Crankarm Average No
Vision Cycles, Inc. LL Crankarm Superior Yes
(2 row(s) affected)
関連項目