📅  最后修改于: 2023-12-03 15:05:17.726000             🧑  作者: Mango
在 SQL Server 中,一个孤立的用户是指存在于数据库中但是与其相关联的 SQL Server 登录已经被删除的用户。因此,这个用户已经没有任何权限进行操作,同时也无法连接到数据库。
一些情况下,例如升级 SQL Server 或者更改登录名等,可能会导致用户成为孤立用户。这时候如果不及时处理,将会对系统运行和安全性产生影响。
解决方法如下所示:
可以使用以下脚本来查找并删除孤立用户:
USE YourDatabaseName
GO
DECLARE @username NVARCHAR(128),
@userID INT;
DECLARE UserCursor CURSOR
FOR
SELECT [name], [principal_id]
FROM sys.database_principals
WHERE [type] IN ('S', 'U', 'G')
AND [name] NOT LIKE '##%'
AND [name] NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys');
OPEN UserCursor;
FETCH NEXT FROM UserCursor
INTO @username, @userID;
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
EXEC sp_change_users_login 'Auto_Fix', @username;
PRINT CONCAT('[Fixed] User - [', @username, ']');
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 15023
BEGIN
EXEC sp_change_users_login 'Report', @username;
PRINT CONCAT('[Reported] User - [', @username, ']');
END;
END CATCH;
FETCH NEXT FROM UserCursor
INTO @username, @userID;
END;
CLOSE UserCursor;
DEALLOCATE UserCursor;
GO
上述脚本会查找在数据库中的每个用户,然后使用sp_change_users_login
过程将其删除。如果删除失败,则将该用户标记为已报告的孤立用户。
如果删除孤立用户不可行,我们可以尝试修复它们。可以使用以下脚本来修复孤立用户:
USE YourDatabaseName;
GO
EXEC sp_change_users_login 'Auto_Fix', 'SQLUserName';
GO
上述脚本将会修复指定的用户。如果一次要修复多个用户,只需多次调用该过程即可。
需要注意的是,如果 SQLServer登录没有匹配的用户名和密码,则无法使用此方法来修复孤立用户。
总的来说,我们需要定期检查 SQL Server 中的孤立用户,并采取相应的解决方案来确保系统运行的稳定性和安全性。