Есть ли сокращенный способ «Auto_Fix» для всех осиротевших пользователей в базе данных SQL Server 2008 R2?

16

Достаточно просто исправить единственного потерянного пользователя SQL для входа в систему, используя:

EXEC sp_change_users_login 'Auto_Fix', 'user'

Я мог бы написать это, но существует ли существующая хранимая процедура, которая автоматически пытается исправить каждого осиротевшего пользователя в данной базе данных?

Дэниел Джеймс Брайарс
источник

Ответы:

15

Тед Крюгер ( @onpnt в твиттере) написал отличный сценарий, который делает это. Он добавляет логины для любого пользователя без логина и запускает auto_fix. Он даже написал один, который включает исправление логинов Windows:

http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/fixing-orphaned-database-users

Конечно, если вы хотите сначала проверить его (или просто выполнить аудит), вы можете закомментировать строки действий ( EXEC) и просто распечатать результаты.

Аарон Бертран
источник
2

Ниже приведен простой скрипт, который отлично справляется со своей задачей.

USE DBNAME     ----- change db name for which you waant to fix orphan users issue

GO


declare @name varchar(150)

DECLARE cur CURSOR FOR
    select name from master..syslogins

Open cur

FETCH NEXT FROM cur into @name

WHILE @@FETCH_STATUS = 0
BEGIN

    EXEC sp_change_users_login 'AUTO_FIX', @name

    FETCH NEXT FROM cur into @name

END

CLOSE cur
DEALLOCATE cur
Devshish
источник
2

основываясь на приведенном выше сценарии, мы можем исправить всех пользователей в экземпляре с помощью sp_MSForeachdb, как это

declare @name varchar(150)
declare @query nvarchar (500)

DECLARE cur CURSOR FOR
    select name from master..syslogins

Open cur

FETCH NEXT FROM cur into @name

WHILE @@FETCH_STATUS = 0
BEGIN

set @query='USE [?]
IF ''?'' <> ''master'' AND ''?'' <> ''model'' AND ''?'' <> ''msdb'' AND ''?'' <> ''tempdb''
BEGIN   
exec sp_change_users_login ''Auto_Fix'', '''+ @name +'''
END'

EXEC master..sp_MSForeachdb @query

    FETCH NEXT FROM cur into @name

END

CLOSE cur
DEALLOCATE cur

надеюсь, это поможет

Phú Nguyễn Dương
источник
Ну, я могу объяснить это следующим образом: 1 получить каждый логин в системных журналах, 2 переназначить пользователя (область действия - уровень базы данных) и логин (область действия - уровень экземпляра) для каждой базы данных
Phú Nguyễn Dương
0

Это было бы хорошим вариантом использования команды dbatools Repair-DbaDbOrphanUser

Сначала вы можете определить осиротевших пользователей

Get-DbaDbOrphanUser -SqlInstance $sqlinstance

ComputerName : SQL01
InstanceName : MSSQLSERVER
SqlInstance  : SQL01
DatabaseName : SockFactoryApp
User         : SockFactoryApp_User

а затем решить их с

Repair-DbaDbOrphanUser -SqlInstance $sqlinstance

ComputerName : SQL01
InstanceName : MSSQLSERVER
SqlInstance  : SQL01
DatabaseName : SockFactoryApp
User         : SockFactoryApp_User
Status       : Success
SQLDBAWithABeard
источник