SQL2005使用起來真是比SQL2000難于上手,登陸名,用戶,架構,角色,權限,反反復復的,沒弄清這個關系. 以前在服務器上的數(shù)據(jù)庫使用遠程連接SQL2000創(chuàng)建的存儲過程,現(xiàn)在下載到本地,所有當時的存儲過程所有者都不是dbo,而安全用戶里有dbo,默認架構也是dbo,登陸名是sa,dbo具有dbowner的權限,原以為這樣以sa創(chuàng)建adodb連接對象的話,是可以操作數(shù)據(jù)庫的所有對象的,沒想到在執(zhí)行到以前的存儲過程時提示:
Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]找不到存儲過程 'Proc_WebCount'。
一下子胡涂了一陣,默認sa就是dbowner權限的,怎么會沒有執(zhí)行權限呢,反復設置dbo權限,架構,還有原來的所有者架構,權限帳號,怎么也不能把現(xiàn)在的所有者與dbo聯(lián)系起來. 最后查了點資料,終于找到修改數(shù)據(jù)庫中各個對象所有者的方法,修改了一下,直接執(zhí)行就可以用,挺方便..
以SA登陸,USE要選擇的數(shù)據(jù)庫,再執(zhí)行下面的SQL語句:
--創(chuàng)建游標,查詢所有者為NiunvDB的記錄
declare csr1 cursor
for
select 'Name' = name
from sysobjects
where user_name(uid)='NiunvDB'
order by name
open csr1 --循環(huán)讀取游標記錄,執(zhí)行系統(tǒng)存儲過程SP_ChangeObjectOwner修改對象所有者
FETCH NEXT FROM csr1 INTO @name
while (@@FETCH_STATUS=0)
BEGIN
SET @name='NiunvDB.'+@name
EXEC SP_ChangeObjectOwner @name, 'dbo'
fetch next from csr1 into @name
END
CLOSE csr1
DEALLOCATE csr1 執(zhí)行以后可以看到
告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
警告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
警告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
警告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
警告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
警告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
警告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
警告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
警告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
警告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
警告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
警告: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
...... 就是符合查詢條件的全部對象的所有者被改了希望的所有者名稱了.然后刷新數(shù)據(jù)庫對象,可以看到,原來的NiunvDB.開頭的存儲過程全部變成了dbo.存儲過程名了..... sysobjects表里存儲了對應數(shù)據(jù)庫的對象數(shù)據(jù),包括表,默認值,主鍵,存儲過程,其中的type字段就表示對象類型,大概意思如下:
P:存儲過程
U:用戶表
K:主鍵
D:默認值
還有幾個類型,想不出來是什么意思,不過這幾個應該夠用了,要查表的信息,還可以使用
select * from INFORMATION_SCHEMA.TABLES
查詢出所有對應數(shù)據(jù)庫中的表數(shù)據(jù),
INFORMATION_SCHEMA.columns可查全部表的列數(shù)據(jù)
INFORMATION_SCHEMA.VIEWS可查全部視圖數(shù)據(jù)
sp_changedbowner 'sa'
可直接更改當前數(shù)據(jù)庫的所有者