登录 | 实名认证,暂停注册 | 在线情况 | 搜索 | 帮助
茗香茶楼百家争茗技术交流SQL修改表的所有者
    
 
SQL修改表的所有者
发起人:孙帅  回复数:3  浏览数:29329  最后更新:2010/4/20 21:30:04 by 孙帅

选择查看 搜索更多相关主题  帖子排序:
孙帅 发表于 2008/8/3 23:39:37
SQL修改表的所有者

    做了这个SQL论坛以后,一直没有解决数据库备份问题。在好多论坛讨教过,目前问题集中到修改表的所有者上来。在网上搜索了好多帖子,比较凌乱地保存在这里,供自己慢慢学习消化。

·转移后由于sql server中的数据库所有者会发生变化,而sql server目前的版本无法自己调整数据表的所有者。
所以您在转移后需要手动修改数据表的所有者。如果您是虚拟主机的话则需要联系主机商进行这个操作。

·解决这个问题的办法很简单:假设你的数据库叫discuz,原来的所有者是用户user1,备份还原后你新建立了一个用户user2,遇到上述问题后,以管理员身份进入查询分析器,选择数据库discuz,执行以下SQL命令:
    EXEC sp_change_users_login update_one, 'user1', 'user2'
    执行完毕后,user2即对discuz数据库拥有权限。另外特别需要提醒的是:当你修改了数据库帐号后,请将论坛dnt.config中的小节里面帐号信息也做相应的修改,然后重新启动IIS里的应用程序池。

·单个修改所有者sql语句如下:
查询分析器输入:EXEC sp_changeobjectowner 'user.table', 'dbo'
user.table的意思为:所有者.表名,比如oblog.oblog_user,以前的语句表示将table这张表的所有者由
user改成dbo
批量修改所有者语句如下:
查询分析器输入:exec sp_msforeachtable 'sp_changeobjectowner ''?'', ''dbo'''
即可把当面表的所有所有者换成dbo

·我建了一个库,用户表的建立者全是DBO,请问如何将所有用户表都的owner全部必为‘aaa'。我发现了一个sp_changeobjectowner   'authors','aaa'这个存储过程,但只能一个一个改。请问用什么方法可以全部改正。
sp_msforeachtable   'sp_changeobjectowner   ?,''aaa'''
先执行这一条语,然后把结果贴出来执行  
  SELECT   'sp_changeobjectowner   @objname   =   '''  
  +ltrim(u.name)   +   '.'   +   ltrim(s.name)   +   ''''+',   @newowner   =   ''aaa'')'    
  FROM     sysobjects   s,sysusers   u    
  WHERE   s.uid   =   u.uid   AND   u.name='dbo'   AND   xtype='U'  
  AND   u.name   not   like   'INFORMATION%'order   by   s.name

·前段时间做了一ASP+SQL2000网站,所有数据全部都集中在SQL2000库里。
    日前公司想新建一网站,根据需求及规划,其实与前期所做的网站的数据库大部分相同,于是,将网上的数据库复制了下来,欲导入新的网站中,但很快发现了一个问题,不能存取导入的数据,添加角色试试,提示:当前数据库中已存在用户或角色,这一下前不着天,后不着地,有数据在,但就是无法去访问,后来一对比,发现是数据表的所有者为在原网站上登录SQL服务器的帐号名,估计问题大概就出在这里,于是想办法去改这个表的所有者,经过搜索相关文章,修改之后,数据库正常存取,新的网站又正常运行起来了!
    现将这一过程记录在案,供参考:
    通过本地所设置的SQL帐号和密码登录SQL查询分析器,使用如下命令就可以很轻松地修改表的所有者:
use 数据库
go
EXEC sp_changeobjectowner ‘原表的所有者.表名’,现在的所有者
F5运行就可以了。
备注:
sp_changeobjectowner       更改当前数据库中对象的所有者。
语法
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'
参数
[@objname =] 'object'
当前数据库中现有的表、视图或存储过程的名称。object 的数据类型为 nvarchar(517),没有默认值。object 可用现有对象所有者限定,格式为 existing_owner.object。
[@newowner =] 'owner'
即将成为对象的新所有者的安全帐户的名称。owner 的数据类型为 sysname,没有默认值。owner 必须是当前数据库中有效的 Microsoft SQL Server 用户或角色或 Microsoft Windows NT® 用户或组。指定 Windows NT 用户或组时,请指定 Windows NT 用户或组在数据库中已知的名称(用 sp_grantdbaccess 添加)。

·Transact-SQL   参考     
  sp_changeobjectowner  
  更改当前数据库中对象的所有者。   
  语法  
  sp_changeobjectowner   [   @objname   =   ]   'object'   ,   [   @newowner   =   ]   'owner'   
  参数  
  [@objname   =]   'object'   
  当前数据库中现有的表、视图或存储过程的名称。object   的数据类型为   nvarchar(517),没有默认值。object   可用现有对象所有者限定,格式为   existing_owner.object。   
  [@newowner   =]   'owner'   
  即将成为对象的新所有者的安全帐户的名称。owner   的数据类型为   sysname,没有默认值。owner   必须是当前数据库中有效的   Microsoft®   SQL   Server™   用户或角色或   Microsoft   Windows   NT®   用户或组。指定   Windows   NT   用户或组时,请指定   Windows   NT   用户或组在数据库中已知的名称(用   sp_grantdbaccess   添加)。   返回代码值  
  0(成功)或   1(失败)   
  注释  
  对象所有者(或拥有对象的组或角色的成员)对对象有特殊的权限。对象所有者可以执行任何与对象有关的   Transact-SQL   语句(例如   INSERT、UPDATE、DELETE、SELECT   或   EXECUTE),也可以管理对象的权限。   
  如果拥有对象的安全帐户必须要除去,但同时要保留该对象,请使用   sp_changeobjectowner   更改对象所有者。该过程从对象中删除所有现有权限。在运行   sp_changeobjectowner   之后,需要重新应用要保留的任何权限。   
  由于这个原因,建议在运行   sp_changeobjectowner   之前,编写现有权限的脚本。一旦更改了对象的所有权,可能要使用该脚本重新应用权限。在运行该脚本之前需要在权限脚本中修改对象所有者。有关编写数据库脚本的更多信息,请参见编写数据库文档和脚本。   
  可以使用   sp_changedbowner   更改数据库的所有者。   
  权限  
  只有   sysadmin   固定服务器角色和   db_owner   固定数据库角色成员,或既是   db_ddladmin   固定数据库角色又是   db_securityadmin   固定数据库角色的成员,才能执行   sp_changeobjectowner。   
  示例  
  下面的示例将   authors   表的所有者改为   Corporate\GeorgeW。   
  EXEC   sp_changeobjectowner   'authors',   'Corporate\GeorgeW'   
  请参见   
  CREATE   TABLE   
  sp_changedbowner   
  系统存储过程

孙帅 发表于 2008/8/6 18:52:07

为了在本机上建一个和网站一模一样的试验环境(同时也为了更好地备份数据,以及学习服务器转移),花费了很多精力,今天终于试验成功了!

具体做法:

1、把空间数据库备份后,强制还原到本机。这时本机数据库表的所有者“sjk”变成了空间上的所有者“A123”,本机论坛无法运行(找不到数据库了),需要重新安装。

2、在强制还原后的本机数据库新建(其实是恢复)原有用户名“sjk”。这一步不能少,不然执行修改表名的语句时就会出现错误:“服务器: 消息 15410,级别 11,状态 1,过程 sp_changeobjectowner,行 55      此数据库中不存在用户或角色 'sjk'。”

3、在企业管理器中选择本机数据库“sjk”,点击工具按钮,选择“SQL 查询分析器”。在查询分析器窗口输入批量修改表的所有者语句:“exec sp_msforeachtable 'sp_changeobjectowner ''?'', ''sjk'''”(不带汉字双引号),执行后出现提示:“注意: 更改对象名的任一部分都可能破坏脚本和存储过程。”

返回企业管理器,本机数据库“sjk”中的表所有者已经改为“sjk”。打开本机论坛,空间上的所有数据原封不动地复制到了本机。

成功了!

孙帅 发表于 2008/8/6 18:57:01

收尾工作:在企业管理器中选择本机数据库“sjk”,点击“用户”。删除因强制还原而出现的空间上的用户“A123”。

大功告成!

孙帅 发表于 2010/4/20 21:30:04

如果本机数据库表的所有者和空间上的所有者相同,均为“sjk”,则在第二步强制还原后的本机数据库新建(其实是恢复)原有用户名时会提示:“无法更改对象"sjk"或其所属的某个子对象的所有者,因为新所有者"sjk"已有同名的对象”无法新建所有者。

此时可先将数据库表的所有者批量修改为“dbo”,删除原所有者“sjk”后再新建这个同名所有者,然后再执行批量修改表的所有者语句,将所有者从“dbo”恢复为“sjk”。

用户在线信息
当前查看此主题的会员: 1 人。其中注册用户 0 人,访客 1 人。


  • 关于本站 版权声明 联系本站 意见建议 大事记
    Powered by BBSXP 2008 MSSQL © 1998-2024 Yuzi.Net
  • Processed in 00.52 second(s)
    Server Time 2024/11/23 12:59:09