web-dev-qa-db-fra.com

Le principal de la base de données possède un schéma dans la base de données et ne peut pas être supprimé

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?

30
rsteckly

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).

32
Thomas Stringer

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:

enter image description here

Si vous ne savez pas quel (s) schéma (s) l'utilisateur possède, vérifiez les propriétés de l'utilisateur.

enter image description here

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é).

enter image description here

30
woodvi

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

enter image description here

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:

  1. obtenir toutes les autorisations de cet utilisateur, avant de le supprimer - juste au cas où vous auriez besoin de revenir en arrière - pour cela, je recommande this ou this
  2. Je n'ai pas vérifié les rôles attribués à cet utilisateur - simplement parce que je n'ai jamais eu ce problème jusqu'à présent
  3. Je ne fais pas de script pour la connexion et la création d'utilisateur - vous pourriez en avoir besoin avant de le déposer
  4. 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'
    

enter image description here

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

0
Marcello Miorelli