📜  SQL Server 中的孤立用户(1)

📅  最后修改于: 2023-12-03 15:05:17.726000             🧑  作者: Mango

SQL Server 中的孤立用户

在 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 中的孤立用户,并采取相应的解决方案来确保系统运行的稳定性和安全性。