Permissions

如何檢測是否有權限查詢 sys.dm_os_performance_counters?

  • December 19, 2019

根據sys.dm_os_performance_counters 文件

在 SQL Server 上,需要VIEW SERVER STATE權限。

在 SQL 數據庫高級層上,需要VIEW DATABASE STATE數據庫中的權限。在 SQL 數據庫標準層和基本層上,需要伺服器管理員Azure Active Directory 管理員帳戶。

如果你有這些權限,你如何從 T-SQL 中檢查?

最終我們解決了!

  • 如果您已連接到 SQL Azure 數據庫,並且數據庫層為高級,請檢查VIEW DATABASE STATE權限
  • 如果您已連接到 SQL Azure 數據庫,並且數據庫層不是高級,請檢查EXECUTE權限sys.dm_os_performance_counters
  • 否則,請檢查VIEW SERVER STATE權限

這不是文件的明顯翻譯的一點是,在非高級 Azure SQL 數據庫的情況下,“EXECUTE權限”等同於“成為伺服器管理員或 Azure Active Directory 管理員”。sys.dm_os_performance_counters這只是我們通過反複試驗發現的,並且在我所知道的任何地方都沒有記錄。

DECLARE @Result VARCHAR(MAX)
SET @Result = ''

IF (SERVERPROPERTY('EngineEdition') = 5)
   BEGIN
       IF (DATABASEPROPERTYEX(DB_NAME(), 'Edition') = 'Premium')
           BEGIN
               IF NOT EXISTS(SELECT 1 FROM sys.fn_my_permissions(NULL, 'DATABASE') WHERE permission_name = 'VIEW DATABASE STATE')
                   SET @Result = 'You do not have VIEW DATABASE STATE permissions for this database.'
           END
       ELSE
           BEGIN
               IF NOT EXISTS(SELECT 1 FROM sys.fn_my_permissions('sys.dm_os_performance_counters', 'OBJECT') WHERE permission_name = 'EXECUTE')
                   SET @Result = 'You do not have server admin or Azure active directory admin permissions.'
           END
   END
ELSE
   BEGIN
       IF NOT EXISTS(SELECT 1 FROM sys.fn_my_permissions(NULL, 'SERVER') WHERE permission_name = 'VIEW SERVER STATE')
           SET @Result = 'You do not have VIEW SERVER STATE permissions within this instance.'
   END
RETURN @Result

引用自:https://dba.stackexchange.com/questions/252659