現在、システム テーブルから選択しようとするストアド プロシージャを実行しようとすると、アクセス許可に関連する問題が発生します。基本的に、必要なデータを 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
以前にこの種の問題に遭遇した人はいますか?