sexta-feira, 25 de setembro de 2015

[resolva] Drop User no SQL Server: The database principal owns a schema in the database, and cannot be dropped


Neste tópico, falarei um pouco sobre a remoção de usuários no servidor de banco de dados.

As vezes deparamos com alguns problemas a deletar os usuários de rede ou de sistemas no servidor,
devido associações de schemas, owner da base, owner de jobs, e conexão de endpoints.

Para solucionar este erro especifico, é necessário retirar o usuário a qual quer deletar de todas essas especificações acima caso se depara com o seguinte erro na tela.

"Drop User: The database principal owns a schema in the database, and cannot be dropped" ?

Segue alguns scripts que podem lhe ajudar a localizar o objeto a ser retirado este objeto.


DECLARE
@USER VARCHAR(20)
SET @USER = 'USER'


SELECT     *
FROM         SYS.DATABASE_PRINCIPALS AS DBPRINCIPAL_1 INNER JOIN
                 SYS.DATABASE_PRINCIPALS AS DBPRINCIPAL_2 
   ON DBPRINCIPAL_1.PRINCIPAL_ID = DBPRINCIPAL_2.OWNING_PRINCIPAL_ID
WHERE     (DBPRINCIPAL_1.NAME = @USER)  


SELECT j . name
 FROM msdb . dbo . sysjobs AS j
 INNER  JOIN sys . syslogins AS l ON j . owner_sid = l . sid
 WHERE l . name =  '@USER'

 /* ================================================================= */

SELECT * FROM SYS.SERVER_PERMISSIONS

WHERE GRANTOR_PRINCIPAL_ID = 262

(SELECT * FROM SYS.SERVER_PRINCIPALS WHERE NAME = N'@USER')


 /* ================================================================= */

SELECT class_desc,*
FROM sys.server_permissions
WHERE grantor_principal_id = (
SELECT principal_id
FROM sys.server_principals
WHERE NAME = N'@USER')

SELECT NAME
,type_desc
FROM sys.server_principals
WHERE principal_id IN (
SELECT grantee_principal_id
FROM sys.server_permissions
WHERE grantor_principal_id = (
SELECT principal_id
FROM sys.server_principals

WHERE NAME = N'@USER'))


Após localizar, basta retirar o usuário a qual deseja deletar dos objetos, caso ele esteja em uma configuração de endpoints (Mirror) é necessário recriar a sua configuração.

Segue o script.

USE [master]
GO

/****** Object:  Endpoint [Mirroring]    Script Date: 25/09/2015 16:11:31 ******/
DROP ENDPOINT [Mirroring]
GO

/****** Object:  Endpoint [Mirroring]    Script Date: 25/09/2015 16:11:31 ******/
CREATE ENDPOINT [Mirroring]
STATE=STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATA_MIRRORING (ROLE = PARTNER, AUTHENTICATION = WINDOWS NEGOTIATE
, ENCRYPTION = REQUIRED ALGORITHM RC4)
GO



Espero que tenho lhe ajudado.

Dúvidas postem os seus comentários.

Abras....