Corrigir para o usuário órfão 'convidado'?

8

O que pode ser feito, se houver alguma coisa, quando o guestusuário especial fica órfão (não está vinculado a nenhum login)?

Para um dos meus bancos de dados (SQL Server 2005), a execução do seguinte lista o usuário convidado como um usuário órfão.

exec sp_change_users_login 'report'

Resultados:

UserName    UserSID
guest       0x3C2E66759FFBC14F84127D6795C27FD3

Se eu tentar corrigir o usuário convidado usando esse procedimento, obtenho o seguinte:

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

Terminando este procedimento. 'guest' é um valor proibido para o parâmetro de nome de login neste procedimento.

Se eu tentar excluir o usuário, recebo:

O usuário 'convidado' não pode ser descartado, apenas pode ser desativado.

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

Resulta em:

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

O banco de dados parece estar confuso quanto a se este é um usuário especial ou não. Existe algo que possa ser feito?

JustinStolle
fonte
Seu SID está listado como em 0x3C2E66759FFBC14F84127D6795C27FD3vez de0x00
JustinStolle 4/12/12
Você já tentou fazer a correção automática? Estou curioso para ver o resultado.
SQLRockstar
Eu receboTerminating this procedure. 'guest' is a forbidden value for the login name parameter in this procedure.
JustinStolle 4/12/12
Você recebe esse erro porque não pode ter convidado como nome de usuário ( msdn.microsoft.com/en-us/library/ms174378.aspx ). Estou tendo dificuldades para recriar seu cenário.
Thomas Stringer
11
Gostaria de acrescentar que encontrei exatamente o mesmo problema que Justin. O problema aqui é que o sid do convidado deve ser 0x00, mas por qualquer motivo, não é e, como tal, sp_change_users_login 'report' o buscará como usuário órfão. Eu simplesmente não consigo ver que há uma maneira de os DBAs mudarem ou atrapalharem [guest] de maneiras normais. Então, eu acho que essa bagunça é altamente possível criada pelos patches do servidor sql em algum momento, de alguma forma.
jyao

Respostas:

5

O usuário "convidado" nunca é atribuído a um login do servidor, mesmo em uma nova instalação, é classificado como um usuário SQL sem um login. Como você só pode definir o SID de um login (na criação), e não um usuário, não acredito que isso seja possível; sp_change_users_login não funciona exatamente porque a conta de convidado nunca deve ser mapeada para um logon do servidor. Como resultado, o usuário "convidado" é sempre um usuário órfão. Provavelmente não é a resposta que você queria :)

DBA Mundial
fonte
Você acha que existe uma maneira de fazer backup / restaurar esse banco de dados em outro local enquanto deixa de fora o usuário convidado da restauração?
JustinStolle
Sim, mas não é bonito. Um simples backup e restauração não funcionaria, pois o usuário convidado seria incluído nisso. Você precisaria começar com um novo banco de dados criado usando o mesmo método usado para instalá-lo originalmente (assumindo que o convidado no modelo tenha o SID correto). Em seguida, do seu sistema existente, exporte todos os dados para seu novo banco de dados. Isso poderia funcionar, mas é um grande esforço para algo tão menor ...
World Wide DBA
Portanto, apesar da conta ter um SID inesperado, você acha que não há realmente nenhum problema e é seguro ignorá-lo no sp_change_users_loginrelatório?
JustinStolle
Nesse caso, eu diria que sim, com base no fato de que não há realmente muito o que você possa fazer sobre isso de qualquer maneira. Depois, há o debate clássico sobre se você deve / não deve usá-lo de qualquer maneira, mas isso é uma questão completamente diferente ... :)
World Wide DBA
2

Meus pensamentos ... A razão sp_change_users_loginestá lançando esse erro é porque a Microsoft também o escreveu. [Examinar o código de procedimento do sistema de vez em quando pode ser divertido. :)] No entanto, o fato de ele aparecer ao executar o relatório indica que alguém / algum processo mexeu com a conta ou um possível hotfix da MS poderia ter feito isso (você nunca sabe).

A conta de convidado deve estar lá, existe em todos os bancos de dados criados, pois a conta existe no modelo por padrão. Fazer com que ele não apareça no relatório provavelmente exigiria que o SID fosse alterado novamente para, 0x00eu acho. Enquanto a conta estiver desativada, eu a deixaria em paz e a ignoraria. Se realmente estivesse me incomodando, eu pagaria o dinheiro e ligaria com o suporte da Microsoft.


fonte
Em outras palavras, você está dizendo que não é um problema que guestaparece nos resultados nesse caso.
JustinStolle
Praticamente sim.
1

Nota: Sempre que você move seu banco de dados de um servidor para outro, geralmente ocorre um problema de usuário órfão. FileListOnly é o novo termo no servidor sql que possui todos os detalhes do backup criado que tem acesso a ele.

Portanto, há uma sequência de tarefas que você deve seguir

  1. Primeiro, você deve restaurar o FileListOnly do backup criado para o destino ou novo servidor.
  2. Restaure o backup.
  3. Use o sp_change_users_login conforme a necessidade. Para obter ajuda sobre esse procedimento, consulte http://msdn.microsoft.com/en-us/library/ms174378.aspx .

Eu coloquei um exemplo aqui espero que ajude:

> 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
fonte
Isso não funcionará para o guestusuário. Veja a resposta acima por Mr.Brownstone.
Simon Righarts