J'essaie de supprimer un principal de la base de données, mais je ne peux pas car il possède un schéma. Cependant, lorsque je modifie l'utilisateur, la case pour décocher les schémas est bleue et inamovible. Comment supprimer le principal de ces schémas?
Essayez le T-SQL pour ce faire:
alter authorization
on schema::YourSchemaName
to dbo
go
drop user TheUserYouWantToDelete
go
Vous ne pouvez pas supprimer un principal qui est un propriétaire de schéma, donc le ALTER AUTHORZATION
modifie le schéma possédé (j'ai utilisé YourSchemaName
, mais évidemment remplacez-le par le schéma possédé dans votre base de données) par dbo
(de même, vous pouvez changer la propriété selon le principal dont vous avez besoin dans votre environnement ). Cela vous permettra de supprimer l'utilisateur propriétaire du schéma (par exemple, j'ai utilisé TheUserYouWantToDelete
, mais ce sera le non-propriétaire que vous souhaitez supprimer).
La méthode T-SQL fonctionne. Merci à http://zarez.net/?p=179 J'ai trouvé le moyen SSMS de le faire (UI).
Pour changer le propriétaire du schéma à partir de Sql Server Management Studio:
Expand your database -> Security -> Schemas
Dans les détails de l'explorateur d'objets, vous pouvez voir une liste des schémas et des propriétaires:
Si vous ne savez pas quel (s) schéma (s) l'utilisateur possède, vérifiez les propriétés de l'utilisateur.
Ouvrez les propriétés du schéma que l'utilisateur possède et cliquez sur "Rechercher" pour trouver un nouveau propriétaire. Si vous ne connaissez pas le nouveau propriétaire, vous pouvez en rechercher un.
Properites -> Search -> Browse
et vous pouvez changer le propriétaire du schéma en dbo (ou celui qui est le plus approprié).
Il a déjà été montré avant qu'avant de supprimer un utilisateur, vous devez réaffecter tout schéma qu'il pourrait posséder à dbo
comme dans l'exemple ci-dessous:
alter authorization
on schema::YourSchemaName_Ownedby_TheUserYouWantToDelete
to dbo
go
drop user TheUserYouWantToDelete
go
Cependant, parfois l'utilisateur que vous souhaitez supprimer se voit attribuer plusieurs schémas. Vous pouvez trouver tous les schémas appartenant à un utilisateur particulier en utilisant ce script:
SELECT S.*
,[the schema ownwer]=dp.name
,dp.type_desc
FROM SYS.schemas S
INNER JOIN SYS.database_principals dp
ON S.principal_id = dp.principal_id
Juste une note: dans l'exemple ci-dessus, l'utilisateur mathura\radhe
a plusieurs schémas dont db_owner
bien que cet utilisateur ne soit PAS le propriétaire de la base de données de cette base de données en particulier.
Vous trouverez ci-dessous une vue partielle du script que j'utilise pour me préparer à déposer un utilisateur dans une base de données.
Il y a d'autres choses à considérer - car elles ne sont pas incluses dans ce script:
Vérifiez toujours que vous êtes sur le bon serveur et la bonne base de données avant d'exécuter ce script
SELECT THE_SERVER = @@SERVERNAME
,THE_DATABASE = QUOTENAME(DB_NAME())
,THE_USER = QUOTENAME(dp.name)
,IS_Orphan = dp.IS_Orphan
,[DROP_USER] =
'USE ' + QUOTENAME(DB_NAME()) +
'; DROP USER [' + dp.name
+ '] '
,[RESET_SCHEMA] =
'USE ' + QUOTENAME(DB_NAME()) +
';' + dp.THE_SCHEMAS +
';'
,[RESET_ROLE] =
'USE ' + QUOTENAME(DB_NAME()) +
'; ALTER AUTHORIZATION ON Role::[' + dp.name
+ '] TO [dbo]'
FROM
(SELECT
[NAME] = dp.name
,IS_Orphan = CASE WHEN (sp.sid is null
AND c.sid is null
AND a.sid is null)
THEN 1 ELSE 0 END
,THE_SCHEMAS = STUFF((
SELECT N';'+ N'ALTER AUTHORIZATION ON SCHEMA::' +
CAST (QUOTENAME(s.name) as sysname) + SPACE(1) + 'TO [dbo]'
FROM sys.schemas s
WHERE s.principal_id = dp.principal_id
FOR XML PATH ('')),1,1,'')
FROM sys.database_principals dp
LEFT OUTER JOIN sys.server_principals sp
ON dp.sid = sp.sid
LEFT OUTER JOIN sys.certificates c
ON dp.sid = c.sid
LEFT OUTER JOIN sys.asymmetric_keys a
ON dp.sid = a.sid
WHERE 1=1
AND dp.type in ('U', 'S', 'C', 'K')
AND dp.principal_id > 4
/*0..4 are system users which will be ignored*/
AND NOT (dp.type = 'S'
AND LEN(dp.sid) = 28)
/*to filter out the valid db users without login*/) dp
WHERE dp.name = 'mathura\radhe'
puis je copie le script généré sur la colonne RESET_SCHEMA:
USE [sgdragnet];
ALTER AUTHORIZATION ON SCHEMA::[mathura\radhe] TO [dbo];
ALTER AUTHORIZATION ON SCHEMA::[radhe] TO [dbo];
ALTER AUTHORIZATION ON SCHEMA::[mathura] TO [dbo];
ALTER AUTHORIZATION ON SCHEMA::[KRISHNA] TO [dbo];
ALTER AUTHORIZATION ON SCHEMA::[db_owner] TO [dbo];
ALTER AUTHORIZATION ON SCHEMA::[db_securityadmin] TO [dbo];
et les autres colonnes contiennent également des informations importantes. J'espère que cela t'aides