No dia a dia da gestão de páginas web, vários cuidados devem ser tomados. Ainda assim, alguns problemas podem acontecer. Um deles é a existência de usuários órfãos.
Usuários órfãos costumam aparecer após a empresa migrar um banco de dados SQL server para um novo servidor. Isso pode impedir que os usuários da sua página tenham acesso aos recursos existentes. Afinal, mesmo que a sua conta esteja cadastrada, não haverá um login a ela associado.
Imagine a quantidade de negócios que a sua empresa perderia se os seus clientes não conseguissem fazer logins no seu e-commerce? Por isso, os usuários órfãos devem ser um objeto de atenção de todo gestor. Continue a leitura e veja como lidar com eles!
Usuário órfão é o termo utilizado para definir as contas de um banco de dados que não estão com um login vinculado a elas. Isso impede que os usuários tenham acesso aos dados, ainda que a sua conta esteja ativa.
Para solucionar esse problema, primeiro é necessário entender como os bancos de dados SQL gerenciam as contas. No SQL, o login é um usuário no nível de instância do banco. Cada um tem uma senha vinculada a si, assim como as políticas de segurança de senha, expiração de login e permissões de acesso ao servidor.
Todos os logins estão vinculados a um usuário, que é criado dentro do banco de dados (onde há o registro dos privilégios que a pessoa terá naquele banco). Como consequência, você pode ter um login para ter acesso à instância em que um grupo de banco de dados se encontra.
Nesse contexto, o usuário órfão surge quando há um utilizador sem um login vinculado ou registrado no banco de dados. Esse é um problema relativamente fácil de resolver e que normalmente aparece após migrações ou restauração de dados. E o melhor de tudo: não há a necessidade de recriar os usuários e logins para restaurar o acesso ao banco de dados.
O primeiro passo para lidar com usuários órfãos é fazer a identificação de quantos existem no banco de dados da sua página web ou do seu e-commerce. Existem diferentes maneiras de fazer isso. Uma delas é a partir do seguinte comando:
USE [Testes] EXEC sp_change_users_login 'Report'
Você também pode executar a operação com o apoio do sys.syslogins (útil para os casos em que o banco de dados é executado no SQL Server 2000 ou em uma versão posterior):
SELECT A.name AS UserName, A.[sid] AS UserSID FROM sys.sysusers A WITH(NOLOCK) LEFT JOIN sys.syslogins B WITH(NOLOCK) ON A.[sid] = B.[sid] WHERE A.issqluser = 1 AND SUSER_NAME(A.[sid]) IS NULL AND IS_MEMBER('db_owner') = 1 AND A.[sid] != 0x00 AND A.[sid] IS NOT NULL AND ( LEN(A.[sid]) <= 16 ) AND B.[sid] IS NULL ORDER BY A.name
Se o seu SQL Server for o 2008 (e versões mais recentes), você também pode utilizar o sys.database_principals:
SELECT A.name AS UserName, A.[sid] AS UserSID FROM sys.database_principals A WITH(NOLOCK) LEFT JOIN sys.sql_logins B WITH(NOLOCK) ON A.[sid] = B.[sid] JOIN sys.server_principals C WITH(NOLOCK) ON A.[name] COLLATE SQL_Latin1_General_CP1_CI_AI = C.[name] COLLATE SQL_Latin1_General_CP1_CI_AI WHERE A.principal_id > 4 AND B.[sid] IS NULL AND A.is_fixed_role = 0 AND C.is_fixed_role = 0 AND A.name NOT LIKE '##MS_%' AND A.[type_desc] = 'SQL_USER' AND C.[type_desc] = 'SQL_LOGIN' AND A.name NOT IN ('sa') AND A.authentication_type <> 0 -- NONE ORDER BY A.name
Para associar o login “Usuario_Orfao” ao usuário “Usuario_Orfao”, basta executar o comando abaixo:
USE [Testes] EXEC sp_change_users_login ‘Auto_Fix’, ‘Usuario_Orfao’ GO
Para validar a operação, basta executar o seguinte comando:
EXEC sp_change_users_login ‘Report’
Basta verificar se o usuário segue nos seus resultados. Em caso negativo, deu tudo certo!
Em alguns casos, a empresa pode ter um grande número de usuários órfãos sem um login a eles vinculado. Nesse caso, o trabalho será um pouco mais extenso. Para recriar os logins, basta executar o comando abaixo:
-- Identifica os usuários órfãos da instância IF (OBJECT_ID('tempdb..#Usuarios_Orfaos') IS NOT NULL) DROP TABLE #Usuarios_Orfaos CREATE TABLE #Usuarios_Orfaos ( [Ranking] INT IDENTITY(1,1), [Database] sysname, [Username] sysname, [SID] UNIQUEIDENTIFIER, [Command] VARCHAR(MAX) ) INSERT INTO #Usuarios_Orfaos EXEC master.dbo.sp_MSforeachdb ' SELECT ''?'' AS [database], A.name, A.[sid], ''EXEC [?].[sys].[sp_change_users_login] ''''Auto_Fix'''', '''''' + A.name + '''''''' AS command FROM [?].sys.database_principals A WITH(NOLOCK) LEFT JOIN [?].sys.sql_logins B WITH(NOLOCK) ON A.[sid] = B.[sid] JOIN sys.server_principals C WITH(NOLOCK) ON A.[name] COLLATE SQL_Latin1_General_CP1_CI_AI = C.[name] COLLATE SQL_Latin1_General_CP1_CI_AI WHERE A.principal_id > 4 AND B.[sid] IS NULL AND A.is_fixed_role = 0 AND C.is_fixed_role = 0 AND A.name NOT LIKE ''##MS_%'' AND A.[type_desc] = ''SQL_USER'' AND C.[type_desc] = ''SQL_LOGIN'' AND A.name NOT IN (''sa'') AND A.authentication_type <> 0 -- NONE ORDER BY A.name' -- Exibe os usuários órfãos da instância SELECT * FROM #Usuarios_Orfaos -- Executa os comandos no banco DECLARE @Comando VARCHAR(MAX) = '' SELECT @Comando += Command + '; ' FROM #Usuarios_Orfaos EXEC(@Comando)
Se você já recriou um login, mas ele não está com o mesmo nome de usuário, a associação é feita da seguinte maneira:
USE [Testes] EXEC sp_change_users_login 'Update_One', 'Usuario_Orfao', -- Usuário 'Usuario_Teste' -- Login GO
Já nos casos em que há um usuário criado e você deseja associá-lo a outro login, basta utilizar a sequência abaixo:
USE [Testes] EXEC sp_change_users_login 'Auto_Fix', 'Usuario_Orfao', -- Usuário NULL, -- Login. Deixar NULL para criar um novo com o mesmo nome do usuário '123' -- Senha do Login que será criado GO
O SQL Server é um dos melhores bancos de dados do mercado. Mas ele não está imune a erros. Por isso todo profissional de TI que trabalha com a gestão de sistemas web ou páginas de e-commerce deve estar atento para sempre aplicar as medidas corretivas necessárias caso algo de errado ocorra.
Como você pode perceber, a existência de usuários órfãos não deve ser visto como algo grave: basta utilizar os comandos acima para corrigir o problema e garantir que as suas migrações de bancos de dados ocorram sem problemas!
Gostou da nossa dica? Então assine a newsletter do blog para ficar por dentro dos nossos conteúdos.