11

現在、システム テーブルから選択しようとするストアド プロシージャを実行しようとすると、アクセス許可に関連する問題が発生します。基本的に、必要なデータを sys.dm_tran_current_transaction テーブルから直接取得することで、SQL Server 2012 での sp_bindtoken システム ストアド プロシージャの廃止を回避しようとしています。

私が見つけた1つの解決策は次のとおりです。

  • 証明書を作成する
  • 証明書からユーザー/ログインを作成する
  • ユーザーに VIEW SERVER STATE 権限を付与する
  • 証明書を使用してストアド プロシージャに署名する
  • 作成したばかりのユーザーのコンテキストで実行されるストアド プロシージャを実行します。

このアプローチは、SQL Server 2008 R2 でうまく機能するようです。ただし、SQL Server 2012 では、スクリプトが正しく実行されているように見えても、実行時に上記のシステム テーブルから選択しようとすると、ストアド プロシージャがアクセス許可エラーで失敗します。

私が現在持っているスクリプトは、次のようになります。

USE OurDatabase
GO

CREATE CERTIFICATE OurDatabaseProcCert
FROM FILE = 'C:\Path\To\OurDatabaseProcCert.cer'
WITH PRIVATE KEY (
FILE = 'C:\Path\To\OurDatabaseProcCert.pvk',
ENCRYPTION BY PASSWORD = '$0m3$tr0ngp@$$w0rd',
DECRYPTION BY PASSWORD = '$0m3$tr0ngp@$$w0rd');
GO

USE master
GO

CREATE CERTIFICATE OurDatabaseProcCert
    FROM FILE = 'C:\Path\To\OurDatabaseProcCert.cer'
WITH PRIVATE KEY (
    FILE = 'C:\Path\To\OurDatabaseProcCert.pvk',
    ENCRYPTION BY PASSWORD = '$0m3$tr0ngp@$$w0rd',
    DECRYPTION BY PASSWORD = '$0m3$tr0ngp@$$w0rd');
GO

CREATE LOGIN OurDatabaseServerLogin
    FROM CERTIFICATE OurDatabaseProcCert
GO

CREATE USER OurDatabaseServerLogin

REVOKE CONNECT SQL FROM OurDatabaseServerLogin
GO 

GRANT AUTHENTICATE SERVER TO OurDatabaseServerLogin
GO

GRANT VIEW SERVER STATE TO OurDatabaseServerLogin
GO

USE OurDatabase
GO

ADD SIGNATURE TO dbo.bsp_getTransactionID BY CERTIFICATE OurDatabaseProcCert WITH PASSWORD = '$0m3$tr0ngp@$$w0rd'

これは、署名/実行しようとしているストアド プロシージャを作成するコードです。

CREATE Procedure bsp_getTransactionID
(
    @TransactionID  VARCHAR(255) OUTPUT
)
AS      
BEGIN
    IF @@TRANCOUNT > 0  
    BEGIN
        SELECT SYSTEM_USER
        SELECT @TransactionID = sys.dm_tran_current_transaction.transaction_id FROM sys.dm_tran_current_transaction
    END 
 RETURN 0
END
GO

以前にこの種の問題に遭遇した人はいますか?

4

1 に答える 1

1

なぜ 2012 年に異なる反応を示すのかはわかりませんがEXECUTE AS <certificate_logon>CREATE PROCEDURE.

理論的には、これはデフォルトが であるため、ソリューションに関しては同等であるはずですがEXECUTE AS owner、反応がわずかに異なる可能性があります??? 試してみる価値があると思います。

于 2011-12-23T13:34:53.223 に答える