1. 程式人生 > >Sybase還原資料庫,業務表為其他使用者所屬,怎樣變更表所有者為自定義使用者。。

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下面都有哪些使用者和表物件:

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/