关于数据库对象所有者非dbo时的可能造成的问题及解决方法

来源:互联网 发布:华凯网络 编辑:程序博客网 时间:2024/05/16 15:35

数据库对象:表,视图,存储过程等

      状:当一个非sysadmin 固定服务器角色成员(非DBA用户),在查询分析器或程序中(asp,vb等),新建一个数据库对象时,数据库对象的所有者为当前的登录的用户。如果程序下一次更改为以DBA身份或者其它身份运行时,就会提示找不到该数据库对象。

      因:如果当前用户不是所有者,则当前用户使用过程时必须指定所有者名称,如果当前用户或 dbo 拥有该对象,则不需要所有者名称

解决方案:

1.       采用指定拥有者的对象  eg: EXECUTE user1.proc1

2.       更改数据库对象的所有者

命令:EXEC sp_changeobjectowner ’object_name’, ’ owner’

知识点:

数据库对象的命名规则如下所示:

[[[server_name.][database_name].][owner_name].]object_name

database_name 的默认值是当前数据库owner_name 的默认值是当前用户。如果当前用户不是所有者,则当前用户使用过程时必须指定所有者名称。因为所有者名称是对象名称的一部分,所以两个不同的用户可以在相同的数据库中拥有对象名称相同的过程(例如 user1.proc1 user2.proc1

{该命名规则的唯一例外是系统过程,这些过程可以从任何数据库执行。系统过程驻留于 master 数据库,由系统管理员所有,其名称以 sp_ 打头。系统过程引用当前数据库的系统表}

对于由数据库的许多用户使用的过程,由 dbo创建该过程是最方便的。这使得所有用户都可以在不指定所有者名称的情况下找到该过程。

如果过程不在执行它的数据库中,则可以通过使用数据库名称完全限定过程名称来避免该错误,如下例所示:

     EXECUTE database_1.user1.proc1 

如果您或 dbo拥有该过程,则不需要所有者名称。例如:

     EXECUTE database_1..proc1 

 

 

 

建议:  在程序中或查询分析器中以非DBA身份登录数据库时,创建一个数据库对象时,请指定数据库对象所有者为:dbo (SQL企业管理器中无需设定,企业管理器对新建一个表时,已经默认为dbo)

Eg: CREATE TABLE [dbo].[11111111111111] (

            [Name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,

            [Password] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

            [Email] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

            [Dept] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,

)  

GO

 

 

 

以下是CREATED TABLE时的说明(摘自SQL ONLINE HELP):

owner 默认为与 database_name 所指定的数据库中的当前连接相关联的用户 ID。如果 CREATE TABLE 语句由 sysadmin 固定服务器角色成员或 database_name 所指定的数据库中的 db_dbowner db_ddladmin 固定数据库角色成员执行,则 owner 可以指定与当前连接的登录相关联的用户 ID 以外的其它用户 ID。如果与执行 CREATE TABLE 语句的登录相关联的用户 ID 仅具有创建表的权限,则 owner 必须指定与当前登录相关联的用户 IDsysadmin 固定服务器角色成员或别名为 dbo 用户的登录与用户 ID dbo 相关联;因此,由这些用户创建的表的默认所有者为 dbo。不是由上述两种角色的登录创建的表所有者默认为与该登录相关联的用户 ID
原创粉丝点击