SQL2005使用起来真是比SQL2000难于上手,登陆名,用户,架构,角色,权限,反反复复的,没弄清这个关系. 以前在服务器上的数据库使用远程连接SQL2000创建的存储过程,现在下载到本地,所有当时的存储过程所有者都不是dbo,而安全用户里有dbo,默认架构也是dbo,登陆名是sa,dbo具有dbowner的权限,原以为这样以sa创建adodb连接对象的话,是可以操作数据库的所有对象的,没想到在执行到以前的存储过程时提示:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]找不到存储过程 'Proc_WebCount'。
一下子胡涂了一阵,默认sa就是dbowner权限的,怎么会没有执行权限呢,反复设置dbo权限,架构,还有原来的所有者架构,权限帐号,怎么也不能把现在的所有者与dbo联系起来. 最后查了点资料,终于找到修改数据库中各个对象所有者的方法,修改了一下,直接执行就可以用,挺方便..
以SA登陆,USE要选择的数据库,再执行下面的SQL语句:
--创建游标,查询所有者为NiunvDB的记录
declare csr1 cursor
for
select 'Name' = name
from sysobjects
where user_name(uid)='NiunvDB'
order by name
open csr1 --循环读取游标记录,执行系统存储过程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 执行以后可以看到
告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。
...... 就是符合查询条件的全部对象的所有者被改了希望的所有者名称了.然后刷新数据库对象,可以看到,原来的NiunvDB.开头的存储过程全部变成了dbo.存储过程名了..... sysobjects表里存储了对应数据库的对象数据,包括表,默认值,主键,存储过程,其中的type字段就表示对象类型,大概意思如下:
P:存储过程
U:用户表
K:主键
D:默认值
还有几个类型,想不出来是什么意思,不过这几个应该够用了,要查表的信息,还可以使用
select * from INFORMATION_SCHEMA.TABLES
查询出所有对应数据库中的表数据,
INFORMATION_SCHEMA.columns可查全部表的列数据
INFORMATION_SCHEMA.VIEWS可查全部视图数据
sp_changedbowner 'sa'
可直接更改当前数据库的所有者