我正在尝试从数据库中删除主体,但是不能删除,因为它拥有架构。但是,当我去编辑用户时,取消选中模式的框为蓝色且不可移动。如何从这些架构中删除主体?

#1 楼

尝试使用T-SQL执行此操作:

alter authorization
on schema::YourSchemaName
to dbo
go

drop user TheUserYouWantToDelete
go


您不能删除作为架构所有者的主体,因此ALTER AUTHORZATION更改了拥有的架构(我使用了YourSchemaName ,但显然用数据库中的拥有架构代替)到dbo(同样,您可以将所有权更改为环境中所需的任何主体)。这样一来,您就可以删除以前拥有模式的用户(例如,出于我使用TheUserYouWantToDelete的目的,但这将是您现在要删除的非所有者)。

评论


好的,这可行。但是我对为什么有些困惑。为什么需要将模式授权给另一个模式?也许我需要查看架构...

–rsteckly
2012年6月18日18:10

@rsteckly简化,授权=所有权。如果您可以删除拥有该模式的用户,则该模式将无效,因为所有者不再存在。想象一下,您可以删除下订单的客户。如果不再有指向的客户,那么“订单”表中的“客户ID”是什么意思?我应该在哪里下订单?

–亚伦·伯特兰(Aaron Bertrand)
2012年6月18日18:20



抱歉,我的示例没有得到很好的解释。我们没有将授权更改为dbo模式,而是将授权更改为dbo主体。那可能是任何数据库主体。

–托马斯·斯金格
2012年6月18日18:32

#2 楼

T-SQL方式有效。多亏了
http://zarez.net/?p=179
,我找到了执行此(UI)的SSMS方法。

从Sql Server更改架构所有者Management Studio:

Expand your database -> Security -> Schemas


在“对象资源管理器详细信息”中,您可以看到模式和所有者的列表:



如果您不知道用户拥有的架构,请检查用户的属性。



打开架构的属性用户拥有的内容,然后单击“搜索”以查找新的所有者。如果您不认识新所有者,则可以“浏览”一个所有者。

Properites -> Search -> Browse


,您可以将架构所有者更改为dbo(或最合适的人) )。



评论


T-SQL方式更好,更灵活。通过GUI进行操作总是很痛苦的!

–金沙(Kin Shah)
2015年5月5日17:05

我全都支持T-SQL方式,也因为它可以在脚本中使用。

–woodvi
15年10月8日在18:01

注意:F7是显示详细信息的快捷方式

–Simon_Weaver
17 Mar 24 '17 at 22:21

#3 楼

之前已经显示过,在删除用户之前,您需要按照以下示例将其可能拥有的任何模式重新分配给dbo

alter authorization
on schema::YourSchemaName_Ownedby_TheUserYouWantToDelete
to dbo
go

drop user TheUserYouWantToDelete
go


但是,有时用户您要删除的分配了多个模式。
您可以使用以下脚本找到特定用户拥有的所有模式:

  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




仅需注意:
在上面的示例中,用户mathura\radhe具有多个模式,包括db_owner,尽管该用户不是该数据库的数据库所有者。

下面是该脚本的部分视图,我准备使用该脚本来将用户拖放到数据库中。

还有其他需要考虑的事情-因为它们未包含在该脚本中:


获取此用户的所有权限,然后再删除它-以防万一您需要回滚-为此,我建议使用此方法或此方法

我没有检查过分配给该用户的角色-只是因为e到目前为止,我从未遇到过此问题
我没有编写登录名和用户创建脚本-在删除它之前可能需要此操作

始终检查您是否在正确的服务器和正确的数据库中在运行此脚本之前

  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'





然后我复制在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];


,其他列也包含重要信息。
希望这会有所帮助