it-swarm-eu.dev

Ředitel databáze vlastní schéma v databázi a nelze ji zrušit

Snažím se odstranit principál z databáze, ale nemůžu, protože vlastní schéma. Když však přejdu upravit uživatele, pole pro zrušení zaškrtnutí schématu je modré a neodstranitelné. Jak mohu z těchto schémat odstranit příkazce?

30
rsteckly

Zkuste to pomocí T-SQL:

alter authorization
on schema::YourSchemaName
to dbo
go

drop user TheUserYouWantToDelete
go

Nemůžete zrušit jistinu, která je vlastníkem schématu, takže ALTER AUTHORZATION změní vlastněné schéma (použil jsem YourSchemaName, ale samozřejmě jej nahradil vlastněným schématem ve vaší databázi) na dbo (podobně můžete změnit vlastnictví na jakoukoli hlavní složku, kterou potřebujete ve svém prostředí) ). To vám umožní zrušit uživatele, který dříve vlastnil schéma (například pro účely jsem použil TheUserYouWantToDelete, ale to bude nyní nevlastnící, kterého chcete zrušit).

32
Thomas Stringer

Způsob T-SQL funguje. Díky http://zarez.net/?p=179 Našel jsem SSMS způsob, jak toho dosáhnout (UI).

Chcete-li změnit vlastníka schématu z Sql Server Management Studio:

Expand your database -> Security -> Schemas

V podrobnostech Průzkumníka objektů můžete vidět seznam schémat a vlastníků:

enter image description here

Pokud nevíte, jaká schémata uživatel vlastní, zkontrolujte vlastnosti uživatele.

enter image description here

Otevřete vlastnosti schématu, které uživatel vlastní, a kliknutím na tlačítko Hledat vyhledejte nového vlastníka. Pokud nového vlastníka neznáte, můžete jej „Procházet“.

Properites -> Search -> Browse

a můžete změnit vlastníka schématu na dbo (nebo na kohokoli, kdo je nejvhodnější).

enter image description here

30
woodvi

Bylo již kázáno dříve , že před zrušením uživatele musíte znovu přiřadit jakékoli schéma, které může vlastnit dbo podle níže uvedeného příkladu:

alter authorization
on schema::YourSchemaName_Ownedby_TheUserYouWantToDelete
to dbo
go

drop user TheUserYouWantToDelete
go

Někdy však má uživatel, kterého chcete odstranit, přiřazeno více než jedno schéma. Pomocí tohoto skriptu můžete najít všechna schémata vlastněná konkrétním uživatelem:

  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

Jen poznámka: V příkladu výše uživatel mathura\radhe má několik schémat včetně db_owner ačkoli tento uživatel NENÍ konkrétně vlastník db této databáze.

Níže je částečný pohled na skript, který používám, abych se připravil na přetažení uživatele do databáze.

Je třeba zvážit i další věci, které nejsou součástí tohoto skriptu:

  1. získání všech oprávnění tohoto uživatele, než jej zrušíte - pouze v případě, že se potřebujete vrátit - k tomu doporučuji this nebo this
  2. Neověřil jsem se o rolích přiřazených tomuto uživateli - jen proto, že jsem tento problém dosud neměl
  3. Nejsem skriptování přihlašovací jméno a vytvoření uživatele - možná budete potřebovat, než ji zrušíte
  4. Před spuštěním tohoto skriptu vždy zkontrolujte, zda jste na správném serveru a správné databázi

      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

pak zkopíruji skript vygenerovaný ve sloupci 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];

a ostatní sloupce také obsahují důležité informace. snad to pomůže

0