转载--SQL还原数据库后孤立用户问题处理(SQL 数据库 拥有对象 没法删除)

SQL还原数据库后孤立用户问题处理(SQL 数据库 拥有对象 没法删除)

所谓孤立账户,就是某个数据库的账户只有用户名而没有登陆名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录web

孤立账户的产生通常是一下两种:
1.将备份的数据库在其它机器上还原;
2.重装系统或SQL SERVER以后只还原了用户库sql

解决方法是使用sp_change_users_login来修复数据库

sp_change_users_login的用法有三种安全

用法1:
exec sp_change_users_login 'REPORT'服务器

列出当前数据库的孤立用户网络

用法2:
exec sp_change_users_login 'AUTO_FIX','用户名'antd

能够自动将用户名所对应的同名登陆添加到syslogins中架构

用法3:
exec sp_change_users_login 'UPDATE_ONE','用户名','登陆名'
将用户名映射为指定的登陆名
----------------------------------------------------------------------------------------------------------------
看看是否有用sqlserver


SQL孤立用户解决方案  fetch


症状

当您将数据库备份恢复到另外一台服务器时,可能会遇到孤立用户的问题SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤

本文介绍了如何解决孤立用户问题

状态

Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中存在的问题

更多信息

虽 然术语登陆和用户常常交换使用,但它们之间有很大的不一样登陆用于用户身份验证,而数据库用户账户用于数据库访问和权限验证登陆经过安全识别符 (SID) 与用户关联访问 SQL Server 服务器须要登陆验证特定登陆是否有效的过程称为身份验证登陆必须与 SQL Server 数据库用户相关联您使用用户账户控制数据库中执行的活动若是数据库中不存在针对特定登陆的用户账户,使用该登陆的用户即便可以链接到 SQL Server 服务器,也没法访问数据库可是,该情形的惟一例外是当数据库包含guest用户账户时与用户账户不关联的登陆将被映射到 guest 用户相反,若是存在数据库用户,但没有与其关联的登陆,则该用户将没法登陆到 SQL Server 服务器中

将数据库恢复到其余服务器时,数据库中包含一组用户和权限,但可能没有相应的登陆或者登陆所关联的用户可能不是相同的用户这种状况被称为存在孤立用户

孤立用户疑难解答

当您将数据库备份恢复到另外一台服务器时,可能会遇到孤立用户的问题如下情形说明了该问题并阐述如何加以解决

1. 向主数据库添加一个登陆,并将默认数据库指定为 Northwind: Use master go sp_addlogin 'test', 'password', 'Northwind'

2. 向刚建立的用户授予访问权限: Use Northwind go sp_grantdbaccess 'test'

3. 备份数据库 BACKUP DATABASE Northwind
TO DISK = 'C:MSSQLBACKUPNorthwind.bak'

4. 将数据库恢复到其余 SQL Server 服务器: RESTORE DATABASE Northwind
FROM DISK = 'C:MSSQLBACKUPNorthwind.bak'
     
恢复的数据库包含名为test的用户,但没有相应的登陆,这就致使test成为孤立用户
5. 如今,为了检测孤立用户,请运行此代码: Use Northwind go sp_change_users_login 'report'
     
输出中列出了全部登陆,其中包含 Northwind 数据库的 sysusers 系统表和主数据库的 sysxlogins 系统表中不匹配的条目

解决孤立用户问题的步骤

1. 为前一步中的孤立用户运行如下命令:

Use Northwind
go
sp_change_users_login 'update_one', 'test', 'test'
     
这样,就将服务器登陆test与 Northwind 数据库用户test从新链接起来

sp_change_users_login 存储过程还可使用auto_fix参数对全部孤立用户执行更新,但不推荐这样作,由于 SQL Server 会尝试按名称匹配登陆和用户大多数状况下这都是可行的;可是,若是用户与错误登陆关联,该用户可能拥有错误的权限

2. 在上一步中运行代码后,用户就能够访问数据库了而后用户可使用 sp_password 存储过程更改密码: Use master
go
sp_password NULL, 'ok', 'test'
     
此存储过程不能用于 Microsoft Windows NT 安全账户经过 Windows NT 网络账户链接到 SQL Server 服务器的用户是由 Windows NT 受权的;所以,这些用户只能在 Windows NT 中更改密码

只有 sysadmin 角色的成员能够更改其余用户的登陆密码
----------------------------------------------------------------------------------------------------------------

SQL2005删除用户的时候,产生数据库主体在该数据库中拥有架构,没法删除的解决办法

--执行以下SQL语句

ALTER   AUTHORIZATION   ON   SCHEMA::db_owner   TO   dbo;
--而后手动删除就能够了


----------------------------------------------------------------------------------------------------------------
[导入]sql2000备份的数据库还原到sql2005后,选择数据库关系图提示:此数据库没有有效全部者,所以没法安装数据库关系图支持对象"的解决方法
sql2000 备份的数据库还原到sql2005后,选择数据库关系图提示:此数据库没有有效全部者,所以没法安装数据库关系图支持对象若要继续,请首先使用数据库属性 对话框的文件页或 ALTER AUTHORIZATION 语句将数据库全部者设置为有效登陆名,而后再添加数据库关系图支持对象
    
解决方法以下:
1设置兼容级别为90(2005为90)
USE [master]
GO
EXEC dbo.sp_dbcmptlevel @dbname='数据库名', @new_cmptlevel=90
GO  

或是选责你还原的数据库,点右键,选属性->选项->兼容级别,选择sqlserver2005(90) 而后肯定,

      这时,你在该数据库下展开数据库关系图节点时会有个提示,"此数据库缺乏一个或多个使用数据库关系图所需的支持对象,是否建立",选择是便可

2经过以上的方法操做,若是问题依然存在的话,按下列方法继续

选择你的数据库,而后选择"安全性"->"用户",选择dbo,打开属性页,如登陆名为空的话,新建查询,而后

use [你的数据库名]
EXEC   sp_changedbowner   'sa'

执行成功后,你再选择"数据库关系图"节点,时提示 此数据库缺乏一个或多个使用数据库关系图所需的支持对象,是否建立",选择是便可 就能够看到原先建的关系图了


----------------------------------------------------------------------------------------------------------------

从 服务器上做导入导出至本地机上,数据库中的表都在,但是表名前段的架构身份不是dbo了,而是服务器上数据库的库名这样架构身份不一样了,程序运行就出问题 了试过单个修改表,在sql2005的属性窗口能够更改架构者,但是N多表哪儿能手动改得过来呀!还请高手指点批量更改的方法在此谢过
SQL   Server2005可使用系统存储过程sp_changeobjectowner更改数据库对象的全部者  
   
sp_changeobjectowner   '对象名(包括架构名)','新架构名'  
   
批量修改请用:  
   
方法一:使用游标  
   
declare   @name   sysname  
declare   csr1   cursor  
for    
      select   TABLE_NAME   from   INFORMATION_SCHEMA.TABLES  
open   csr1  
   
FETCH   NEXT   FROM   csr1   INTO   @name  
while   (@@FETCH_STATUS=0)  
      BEGIN  
SET   @name='原架构名.'+@name  
                  EXEC   SP_ChangeObjectOwner   @name,   '新架构名'  
    fetch   next   from   csr1   into   @name  
      END  
CLOSE   csr1  
DEALLOCATE   csr1  
   
方法二:使用系统存储过程sp_MSforeachtable  
EXEC   sp_MSforeachtable   @command1="EXEC   SP_ChangeObjectOwner   '?','新架构名'"
----------------------------------------------------------------------------------------------------------------
在sql server 2005数据库中更改数据架构
在数据库testDB中存在架构A及用户A,现将testDB数据库所属的用户由A改成B,同时删除用户A;架构也由A改成B,删除架构A,操做以下:

1建立用户B,再建立架构B;
2将架构A的权限赋给用户B,取消用户A拥有架构A的权限,删除用户A;
3将数据库的全部属于架构A的对象改成架构B,代码以下:
ALTER SCHEMA [新架构名] TRANSFER 旧架构名.[数据库中的对象表或视图或存储过程]

ALTER SCHEMA [B] TRANSFER A.[对象1]
ALTER SCHEMA [B] TRANSFER A.[对象2]
ALTER SCHEMA [B] TRANSFER A.[对象n]


4删除架构A

 

======================================================

转载出处-- http://hi.baidu.com/webhi/item/7d6e4c2230cb2a464699620a
相关文章
相关标签/搜索