Исправить для бесхозного пользователя 'гость'?

8

Что можно сделать, если что-нибудь, когда специальный guestпользователь осиротел (не связан ни с каким логином)?

Для одной из моих баз данных (SQL Server 2005) при выполнении следующего перечисляется гостевой пользователь как потерянный пользователь.

exec sp_change_users_login 'report'

Результаты:

UserName    UserSID
guest       0x3C2E66759FFBC14F84127D6795C27FD3

Если я пытаюсь исправить гостевого пользователя с помощью этой процедуры, я получаю следующее:

exec sp_change_users_login 'update_one', 'guest', 'guest'

Прекращение этой процедуры. 'guest' - это запрещенное значение для параметра имени входа в этой процедуре.

Если я пытаюсь удалить пользователя, я получаю:

Пользователь 'guest' не может быть удален, его можно только отключить.

select * from sys.database_principals where name = 'guest'

Результаты в:

name                 guest
principal_id         2
type                 S
type_desc            SQL_USER
default_schema_name  guest
create_date          11/13/98 2:58 AM
modify_date          10/16/01 4:31 PM
owning_principal_id  NULL
sid                  0x3C2E66759FFBC14F84127D6795C27FD3
is_fixed_role        0

База данных, похоже, не понимает, является ли это специальный пользователь или нет. Есть ли что-нибудь, что можно сделать?

JustinStolle
источник
Его SID указан как 0x3C2E66759FFBC14F84127D6795C27FD3вместо0x00
JustinStolle
Вы уже пытались сделать автоматическое исправление? Мне любопытно увидеть результат.
SQLRockstar
Я получаюTerminating this procedure. 'guest' is a forbidden value for the login name parameter in this procedure.
JustinStolle
Вы получаете эту ошибку, потому что у вас не может быть гостя в качестве имени пользователя ( msdn.microsoft.com/en-us/library/ms174378.aspx ). Мне трудно воссоздать твой сценарий.
Томас Стрингер
1
Я хотел бы добавить, что столкнулся с той же проблемой, что и Джастин. Проблема здесь в том, что sid гостя должен быть 0x00, но по какой-то причине это не так, и поэтому sp_change_users_login 'report' подберет его как осиротевшего пользователя. Я просто не вижу, чтобы администраторы БД могли каким-то образом изменить или испортить [guest] sid. Так что я думаю, что этот беспорядок, возможно, каким-то образом создается патчами SQL Server.
Цзяо

Ответы:

5

Пользователь «гость» никогда не назначается для входа на сервер, даже при новой установке он классифицируется как пользователь SQL без имени входа. Поскольку вы можете установить только SID логина (при создании), а не пользователя, я не верю, что это возможно; Процедура sp_change_users_login не работает точно по той причине, что учетная запись гостя никогда не должна быть сопоставлена ​​с именем входа на сервер. В результате пользователь «гость» всегда является осиротевшим пользователем. Вероятно, не тот ответ, который вы хотели, хотя :)

World Wide DBA
источник
Как вы думаете, есть ли способ сделать резервную копию / восстановить эту базу данных в другое место, исключив гостя из восстановления?
JustinStolle
Да, но это не красиво. Простое резервное копирование и восстановление не будет работать, так как в него будет включен гостевой пользователь. Вам нужно будет начать с новой базы данных, созданной с использованием того же метода, который вы использовали для первоначальной установки (при условии, что у гостя в модели правильный SID). Затем из существующей системы экспортируйте все данные в новую базу данных. Это сработало бы, но для чего-то столь незначительного нужно много усилий ...
World Wide DBA
Таким образом, несмотря на то, что у учетной записи есть неожиданный SID, вы думаете, что на самом деле с этим нет проблем, и это безопасно игнорировать в sp_change_users_loginотчете?
JustinStolle
В этом случае я бы сказал, основываясь на том факте, что на самом деле вы ничего не можете с этим поделать. Затем идут классические дебаты о том, следует ли вам / не следует использовать его в любом случае, но это совершенно другой вопрос ... :)
World Wide DBA
2

Мои мысли ... Причина кроется sp_change_users_loginв том, что MS тоже это написала. [Просматривать код системной процедуры время от времени может быть весело. :)] Однако тот факт, что он появляется при запуске отчета, указывает на то, что кто-то / какой-то процесс испортил учетную запись, или возможное оперативное исправление от MS могло бы сделать это (вы никогда не знаете).

Предполагается, что гостевая учетная запись существует, она существует в каждой создаваемой базе данных, поскольку учетная запись существует в модели по умолчанию. 0x00Я полагаю, что для того, чтобы он не отображался в отчете, потребовалось бы вернуть SID обратно . Пока учетная запись отключена, я оставляю ее в покое и игнорирую ее. Если бы это действительно беспокоило меня, я бы раскошелился на деньги и позвонил бы в службу поддержки Microsoft.


источник
Другими словами, вы говорите, что это не проблема, которая guestпроявляется в результатах в этом случае.
JustinStolle
Да, довольно.
1

Примечание. Каждый раз, когда вы перемещаете базу данных с одного сервера на другой, обычно возникает проблема, связанная с отсутствием пользователя. FileListOnly - это новый термин в SQL Server, который содержит все детали созданной резервной копии, которая имеет к ней доступ.

Таким образом, есть последовательность задач, которым вы должны следовать

  1. Сначала необходимо восстановить FileListOnly из созданной резервной копии на целевой или новый сервер.
  2. Восстановите резервную копию.
  3. Используйте sp_change_users_login согласно необходимости. Для получения справки об этой процедуре вы можете обратиться по адресу http://msdn.microsoft.com/en-us/library/ms174378.aspx .

Я положил пример здесь, надеюсь, что это поможет:

> RESTORE FILELISTONLY FROM DISK = N'C:\YourDB.bak'
> 
> RESTORE DATABASE YourDb FROM DISK = N'C:\YourDB.bak' WITH MOVE
> N'YourDB' TO N'D:\YourDB.mdf', MOVE N'YourDB_log' TO N'D:\YourDB.ldf',
> REPLACE
> 
> exec YourDB.dbo.sp_change_users_login 'update_one', 'UserName','UserName'
JP Chauhan
источник
Это не будет работать для guestпользователя. Смотрите ответ выше мистером Браунстоуном.
Саймон Ригартс