ストアド プロシージャの変更

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

この記事では、SQL Server Management Studio または Transact-SQL を使用して、SQL Server のストアド プロシージャを変更する方法について説明します。

制限事項

Transact-SQL ストアド プロシージャを CLR ストアド プロシージャに変更したり、その逆に変更することはできません。

以前のプロシージャ定義が WITH ENCRYPTION または WITH RECOMPILE を使用して作成されている場合、これらのオプションは ALTER PROCEDURE ステートメントに含まれている場合に限って有効になります。

アクセス許可

プロシージャに対する ALTER PROCEDURE 権限が必要です。

SQL Server Management Studio を使用します。

SQL Server Management Studio でプロシージャを変更するには:

  1. オブジェクト エクスプローラーで、データベース エンジンのインスタンスに接続し、そのインスタンスを展開します。

  2. [データベース]を展開し、プロシージャが属するデータベースを展開し、 [プログラミング]を展開します。

  3. [ストアド プロシージャ] を展開し、変更するプロシージャを右クリックして、[変更] を選択します。

  4. ストアド プロシージャのテキストを変更します。

  5. 構文をテストするには、[クエリ] メニューの [解析] を選択します。

  6. 変更をプロシージャの定義に保存するには、[クエリ] メニューの [実行] を選択します。

  7. 更新されたプロシージャの定義を Transact-SQL スクリプトとして保存するには、[ファイル] メニューの [名前を付けて保存] を選択します。 ファイル名をそのまま使用するか、または新しい名前に置き換え、[保存] を選択します。

重要

すべてのユーザー入力を検証します。 ユーザー入力は検証するまで連結しないでください。 検証していないユーザー入力から作成されたコマンドは、絶対に実行しないでください。 未検証のユーザー入力は、SQL インジェクション攻撃と呼ばれる一種の悪用に対してデータベースを脆弱にします。 詳細については、「SQL インジェクション」を参照してください。

Transact-SQL の使用

T-SQL コマンドを使用してプロシージャを変更するには:

  1. オブジェクト エクスプローラーで、データベース エンジンのインスタンスに接続し、そのインスタンスを展開します。

  2. [データベース]を展開し、プロシージャが属するデータベースを展開します。 または、ツール バーの利用可能なデータベースの一覧からデータベースを選択します。 この例では AdventureWorks2022 データベースを選択します。

  3. [ファイル] メニューで [新しいクエリ] を選択します。

  4. 次の例をコピーし、クエリ エディターに貼り付けます。 この例では、Adventure Works Cycles データベース内のすべてのベンダーの名前、ベンダーが提供する製品、信用格付け、および現時点で製品を提供可能かどうかを返す Purchasing.uspVendorAllInfo プロシージャを作成します。

    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 'Rating',   
          v.ActiveFlag AS Availability  
        FROM Purchasing.Vendor v   
        INNER JOIN Purchasing.ProductVendor pv  
          ON v.BusinessEntityID = pv.BusinessEntityID   
        INNER JOIN Production.Product p  
          ON pv.ProductID = p.ProductID   
        ORDER BY v.Name ASC;  
    GO   
    
  5. [ファイル] メニューで [新しいクエリ] を選択します。

  6. 次の例をコピーし、クエリ エディターに貼り付けます。 この例では、 uspVendorAllInfo プロシージャが変更されます。 EXECUTE AS CALLER 句が削除され、指定した製品を供給するベンダーだけを返すようにプロシージャの本体が変更されます。 ここでは、 LEFT 関数および CASE 関数を使用して、結果セットの表示をカスタマイズします。

    重要

    既存のストアド プロシージャを削除して再作成すると、ストアド プロシージャに明示的に与えられている権限が削除されます。 代わりに、ALTER を使用して既存のストアド プロシージャを変更します。

    ALTER PROCEDURE Purchasing.uspVendorAllInfo  
        @Product varchar(25)   
    AS  
        SET NOCOUNT ON;  
        SELECT LEFT(v.Name, 25) AS Vendor, LEFT(p.Name, 25) AS 'Product name',   
        '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.BusinessEntityID = pv.BusinessEntityID   
        INNER JOIN Production.Product AS p   
          ON pv.ProductID = p.ProductID   
        WHERE p.Name LIKE @Product  
        ORDER BY v.Name ASC;  
    GO  
    
  7. 変更をプロシージャの定義に保存するには、[クエリ] メニューの [実行] を選択します。

  8. 更新されたプロシージャの定義を Transact-SQL スクリプトとして保存するには、[ファイル] メニューの [名前を付けて保存] を選択します。 ファイル名をそのまま使用するか、または新しい名前に置き換え、[保存] を選択します。

  9. 変更したストアド プロシージャを実行するには、次の例を実行します。

    EXEC Purchasing.uspVendorAllInfo N'LL Crankarm';  
    GO