Sql-Server

刪除孤立的 SQL 使用者

  • April 10, 2019

我有一個 Microsoft SQL Server,它有一個名為 SQLDATABASE 的數據庫。它還有一個名為 SQLUSER 的使用者。SQLDATABASE 已刪除,但未刪除 SQLUSER。SQLUSER 只屬於 SQLDATABASE。我想知道所有不屬於 SQL 數據庫的“損壞”使用者(例如 SQLUSER),以便我可以“清理房屋”。我可以進入每個 sql 使用者並通過查看它們是否已附加來刪除它們,但這似乎非常低效並且腳本可以提供幫助。這就是我要問的。

伺服器有 200 個 SQL 數據庫,但有 250 個 SQL 使用者。我想刪除額外的 50 個 SQL 使用者,因為它們沒有被使用並且沒有理由擁有它們。

我正在嘗試找到一個腳本來讓我找到(並刪除)這些 SQL 使用者或至少辨識,這樣我就不必單獨進入每個 SQL 使用者。

術語似乎有些混亂。使用者存在於數據庫級別,並在您刪除數據庫時被刪除。登錄存在於伺服器級別,並映射到數據庫使用者以訪問數據庫。

我假設您要查找未映射到數據庫使用者並因此可能不再使用的所有登錄名。下面的查詢將實現:

CREATE TABLE ##UnusedLogins (
   [Login] NVARCHAR(255),
   [InUse] BIT
)

INSERT INTO ##UnusedLogins ([Login], [InUse])
SELECT [login].[name] AS [Login],
   0 AS [InUse]
FROM sys.server_principals [login]
WHERE [login].[name] NOT LIKE 'NT SERVICE\%'
   AND [login].[name] NOT LIKE 'NT AUTHORITY\%'
   AND [login].[name] NOT LIKE '##%'
   AND [login].[type_desc] <> 'SERVER_ROLE'
   AND [login].[name] <> 'sa'

EXEC sp_msforeachdb 'UPDATE ul
SET [InUse] = 1
FROM ##UnusedLogins ul
INNER JOIN sys.server_principals [login] ON [login].[name] = ul.[Login]
INNER JOIN [?].sys.database_principals [user] ON [user].[sid] = [login].[sid]'

SELECT * FROM ##UnusedLogins

DROP TABLE ##UnusedLogins

輸出中 InUse 列中為 1 的任何登錄都映射到數據庫使用者。任何帶有 0 的登錄名都不會被映射。這並不意味著登錄沒有被使用,只是它沒有映射到任何數據庫使用者。

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