Sql-Server

如何查找登錄名擁有的所有實體?

  • September 11, 2022

我必須生成一份報告,列出特定登錄名擁有的所有 SQL 實體。

有什麼方法可以使用 SQL 審計/dmv 審計/獲取登錄所擁有的所有實體的列表?

例如:目前我正在研究代理工作(sysjobs),以及每個數據庫的所有者屬性(sys.databases)。不確定要調查哪些地方以涵蓋所有實體。任何建議都會有所幫助。

登錄名可以擁有數據庫,但使用者擁有模式或模式範圍的對象,因此您需要將使用者映射到登錄名。

以下腳本應該為您提供給定主體的所有這些數據庫級對象。模式預設歸數據庫所有者所有,對象預設歸模式所有者所有,除非在這種情況下發生更改,否則此查詢將顯示它們。

至於子數據庫級別的數據,你必須指定數據庫,例如YourDatabase.sys.objects如果你想要所有的數據庫,如果需要的話不要忘記數據庫級別的對象master和其他系統數據庫。

此頁面上提供了可以擁有的對象的完整列表,但通用模板如下所示:

DECLARE @id int = (SELECT dp.principal_id FROM sys.database_principals dp WHERE dp.name = 'UserName');

SELECT 'Schema', s.name
FROM sys.schemas s
WHERE s.principal_id = @id

UNION ALL

SELECT 'Object', o.name
FROM sys.objects o
WHERE o.principal_id = @id

SELECT 'Object', as.name
FROM sys.asymmetric_keys as
WHERE as.principal_id = @id

.....

伺服器登錄也可以擁有一些伺服器對象。您可以以類似的方式執行此操作

DECLARE @id int;
DECLARE @sid varbinary(85);

SELECT
 @id = sp.principal_id,
 @sid = sp.sid
FROM sys.server_principals sp
WHERE sp.name = 'LoginName';

SELECT 'Database' AS ObjectType, d.name
FROM sys.databases d
WHERE d.owner_sid = @sid

UNION ALL

SELECT 'Assembly' AS ObjectType, a.name
FROM sys.assemblies a
WHERE as.principal_id = @id

.....

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