Разрешение хранимой процедуре выбора из системной таблицы с использованием сертификата в SQL Server 2012

В настоящее время у меня возникают проблемы, связанные с разрешениями при попытке запустить хранимую процедуру, которая пытается выбрать из системной таблицы. В основном я я пытаюсь чтобы обойти устаревание системной хранимой процедуры sp_bindtoken в SQL Server 2012 путем прямого извлечения данных из таблицы sys.dm_tran_current_transaction.

Я нашел одно решение:

  • Создать сертификат
  • Создать пользователя / логин из сертификата
  • Предоставить пользователю разрешение ПРОСМОТРЕТЬ СОСТОЯНИЕ СЕРВЕРА
  • Подписать хранимую процедуру с помощью сертификата
  • Выполнение хранимой процедуры, которая выполняется в контексте только что созданного пользователя

Этот подход, кажется, отлично работает в 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

Кто-нибудь раньше сталкивался с подобной проблемой? ?

11
задан Deduplicator 6 September 2015 в 19:06
поделиться