Sybase还原数据库,业务表为其他用户所属,怎样变更表所有者为自定义用户。。

SYBASE数据库技术,数据库恢复

前言:ASE 15.7 新增了命令可以将数据库对象的所有权从一个所有者移交给另一个所有者。

比如将表customer的所有权从dbo移交给bill,使用命令: alter table dbo.customer modify owner bill

不仅仅限于表,还有其它数据库对象包括:视图、存储过程、用户定义函数、默认值、规则、自定义数据类型、加密密钥等;

一次性可以授予多个数据库对象:

1、将 bill 拥有的所有表的所有权都移交给 eric:
    alter table bill.* modify owner eric preserve permissions

2、将 bill 拥有的所有对象的所有权都移交给 eric:
    alter all bill.* modify owner eric preserve permissions

以下提供的方法适用于低于ASE 15.7的版本!

和SQL Server很相似,Sybase ASE数据库有一些未认证的DBCC命令。日常的维护过程中,需要一些Sybase认证的、公开的DBCC命令来完成,比如:检查数据库或者表的一致性、物理存储分配一致性、重建索引等等。对于这些公开的DBCC命令,Sybase公司是提供技术支持保障的。那些未公开的也就是未认证的DBCC命令,仅限Sybase内部工程师使用;Sybase公司不提供技术支持也不会对于此产生的问题负责。

本篇介绍一个用来关闭或者重启某个用户数据库的未认证DBCC命令:dbcc dbreboot。顺便介绍一个修改对象所有者的方法。因为在ASE中对象的所有权是不能移交的,其它用户只有使用权。看到这里肯定有点伤心,别急。

我的环境是12.5,使用isql或sql advantage连接到sybase数据库.

先来查看一下用户数据库ddb下面都有哪些用户和表对象:

扫描二维码关注公众号,回复: 3985957 查看本文章
use kylwsp_gather(数据库名称)

go

select uid,name from sysusers where uid < 1000 order by uid

go

 uid         name

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

           1 dbo

           3 kylwsp

数据库kylwsp_gather内有个非系统用户:kylwsp,这是还原的数据库与新建立的数据库用户不匹配导致的

select uid,count(*) from sysobjects group by uid order by uid go

 uid

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

           1          43

           3          56

(2 rows affected)

用户dbo拥有43个对象,另外56个对象归用户kylwsp所属。

下面开始将用户kylwsp拥有的56个对象“移交”给其它的用户:dbo,这里移交的意思就是将对象的所有权转移给其它用户dbo。Sybase ASE中是不支持这么做的。官方的推荐的做法就是重建用户表及其它对象。我这里提供的方法是“非官方”的,或许会存在问题,不过我在多次测试后没发现问题。建议大家在测试开发环境上可以这么做。

启用服务器选项“allow updates to system tables”来允许修改系统表,在用户事务内修改表数据来回退错误的操作步骤。

begin tran go
update sysobjects  set uid = 1where uid = 3 go

(56 rows affected)

这里可能会报错:Ad-hoc updates to system catalogs not enabled. A user with System Security O

这是由于没用服务器选项“allow updates to system tables”来允许修改系统表,使用命令开启:

use master
exec sp_configure 'allow updates',1
go

 

begin transaction
update sysxlogins
set xstatus='29'
where xstatus='2'
commit transaction
exec sp_configure 'allow updates',0
go


我是直接运行上面第一个命令就可以了

以上就将系统表sysobjects中记录对象拥有者uid的信息由kylwsp改成了dbo。内存中的元数据信息是没有办法改的,如果马上进行查询数据库的操作会报错的,也就是说ASE服务器还是“固执”认为被修改所属者的那些表还是属于原来所有者的。如果让ASE认为被修改的这些表属于patrol而不是原来的rep了,方法是重新装载元数据信息。12.5ASE版本中可以通过重启ASE服务器,15以后用dbcc dbreboot命令来重启某个用户数据库,而不是所有的库了。

执行dbcc dbreboot(“kylwsp_gather”,kylwsp),shutdown是个系统关键字,需要加双引号。

dbcc dbreboot(“kylwsp_gather”,kylwsp) go

---------- Shutting Down Database 'ddb' ----------

Msg 2202, Level 16, State 1:

Server 'TEST', Line 1:

You cannot start database shutdown from the database to be shut down.

---------- Operation on Database 'ddb' Failed ----------

必须在master数据库内部执行这个命令:dbcc dbreboot(“kylwsp_gather”,kylwsp)

后边就重新登录验证数据

参考文献:http://www.dbainfo.net/one-undocument-dbcc-command-handover-table-ownership.htm

http://blog.itpub.net/10640532/viewspace-607656/

猜你喜欢

转载自blog.csdn.net/qq_20957669/article/details/81071685