社区
MS-SQL Server
帖子详情
sql 中定义的函数,为何调用时,前面还要加 dbo.才行呢?好象执行存贮过程不用加dbo.呢?
renchangjiu
2006-07-20 01:32:23
sql 中定义的函数,为何调用时,前面还要加 dbo.才行呢?好象执行存贮过程不用加dbo.呢?
如果不加dbo. 则系统就会提示:不是可以识别的 函数名。
请大家指教.谢谢.
...全文
1574
9
打赏
收藏
sql 中定义的函数,为何调用时,前面还要加 dbo.才行呢?好象执行存贮过程不用加dbo.呢?
sql 中定义的函数,为何调用时,前面还要加 dbo.才行呢?好象执行存贮过程不用加dbo.呢? 如果不加dbo. 则系统就会提示:不是可以识别的 函数名。 请大家指教.谢谢.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
renchangjiu
2006-07-22
打赏
举报
回复
谢一两清风,可惜我已经结过贴了.没法给分了,有情后补吧.
呵呵!
hellowork
2006-07-22
打赏
举报
回复
SQLSERVER要求在调用函数时,只有返回表值的函数可以不加所有者,否则必须加所有者名称,具体请参阅CREATE FUNCTION帮助.所以这又是一个我们要遵守的规则.
至于所有者是不是都是dbo,要看创建这个函数的用户是谁,在这一点上函数与表或存储过程没有任何区别,也就是说所有者就是创建她的用户.
我们常见的dbo是指以sa(SQLSERVER登录方式)或windows administration(Windows集成验证登录方式)登录的用户,也就是说数据库管理员在SQLSERVER中的用户名就叫dbo,而不叫sa,这一点看起来有点蹊跷,因为通常用户名与登录名相同(不是强制相同,但为了一目了然通常都在创建用户名时使用与登录名相同的名字),例如创建了一个登录,名称为me,那么可以为该登录名me在指定的数据库中添加一个同名用户,使登录名me能够访问该数据库中的数据.当在数据库中添加了一个用户me后,之后以me登录名登录时在该数据库中创建的一切对象(表,函数,存储过程等)的所有者都为me,如db.me.table1,db.me.fn_test(),而不是dbo.
不管怎样,只要记住了sa这个登录名对应的用户名是dbo而不是sa就行了.
另外,不要混淆登录名与用户名.登录名只是具有连接到SQLSERVER的权限,而没有访问SQLSERVER上数据库的权限,所以要为该登录名在指定的数据库中创建用户名,使其可以访问那个数据库中的数据.一个登录名可以在多个数据库中创建用户名,以使这个登录名能够访问多个数据库(在登录连接的字符串中指定默认的数据库名称),但是一个登录名在一个数据库中只能创建一个对应的用户名,也就是说me登录名在pubs数据库(举例)只能创建一个用户名.
比喻一下:SQLSERVER就象一栋大楼,里面的每个房间都是一个数据库.登录名只是进入大楼的钥匙,而用户名则是进入房间的钥匙.一个登录名可以有多个房间的钥匙.SQLSERVER把登录名与用户名的关系称为映射.
至于为什么要使用所有者进行限定,是因为不同的用户可能创建同名的对象,例如登录名me和登录名you在pubs数据库中分别创建了用户名me,和you,这二个用户都创建了testtable这个同名表,而这二个表虽然同名但结构或数据可能完全不同,为了避免调用错误,必须使用所有者名称进行限定.
还有,怎样来调用别的用户创建的对象呢?例如me用户访问you用户创建的表或访问dbo创建的表.此种情况,必须同时满足二个条件:
1.将me用户的数据库角色设置为db_owner,否则无法访问其他用户(包括dbo用户)创建的对象.(企业管理器->用户,右键菜单<属性>中设置)
2.使用所有者进行限定.
例如me访问you创建的testtable:
select * from you.testtable
另外,dbo用户作为管理员,系统赋予其所有的权限,可以调用任何用户创建的对象.
如果具有db_owner角色的用户在访问对象时省略了所有者,则系统先查找该用户的对象,若找不到则查找dbo用户是否有同名对象.例如:
select * from testtable 或
select * from pubs..testtable
renchangjiu
2006-07-21
打赏
举报
回复
虽然是规定,可是话说回来,规定也是有原因的呀,为何执行存贮过程,名称前不用加所有者,可是执行函数时,名称前必须加所有者呢?
十一月猪
2006-07-21
打赏
举报
回复
数据库所有者 (dbo)
dbo 是具有在数据库中执行所有活动的暗示性权限的用户。将固定服务器角色 sysadmin 的任何成员都映射到每个数据库内称为 dbo 的一个特殊用户上。另外,由固定服务器角色 sysadmin 的任何成员创建的任何对象都自动属于 dbo。
只有由 sysadmin 固定服务器角色成员(或 dbo 用户)创建的对象才属于 dbo。由任何其他也不是 syadmin 固定服务器角色成员的用户(包括 db_owner 固定数据库角色成员)创建的对象:
属于创建该对象的用户,而不是 dbo。
xyxfly
2006-07-20
打赏
举报
回复
呵呵,只知道加上DBO就可以用了~
liangpei2008
2006-07-20
打赏
举报
回复
1.不全是!
2.如果2者都属于dbo,则均可以调用
renchangjiu
2006-07-20
打赏
举报
回复
我对所有者的概念不是太清楚。是不是所有函数在调用前,前面加上dbo.就可以呀。
比如用A用户登录创建的函数,B用户登录后就不能用吗?
LouisXIV
2006-07-20
打赏
举报
回复
执行函数必须要加所有者名,没有理由
点点星灯
2006-07-20
打赏
举报
回复
没有为什么,语法要求就是这样
帆软报表
调用
my
sql
存储
过程
_finereport报表,使用带参数的
sql
存储
过程
,报没有返回数据集的错...
原因:在
Sql
Server数据库
中
,若
定义
的存储
过程
中
包含有insert/update等更新操作
时
,在设计器
中
对存储
过程
进行
调用
时
,会提示没有返回数据集的错误。解决方法:修改存储
过程
,在begin 后面添
加
SET NOCOUNT ON。不管多复杂的
sql
存储
过程
只需要在第一个大的begin后面添
加
如下:ALTER proc [
dbo
].[proc_enterylist] @qybm varc...
JdbcTemplate调取
Sql
Server的存储
过程
JdbcTemplate调取
Sql
Server存储
过程
SQL
server_存储
过程
参数: 存储
过程
的参数分为两种,输入参数和输出参数 A)输入参数 在存储
过程
中
,参数与as的位置关系决定了该参数的性质; (1) as里面的变量是局部变量,只用与存储
过程
本身; as外面的变量是输入参数,在
调用
这个存储
过程
的
时
候就要提供这个参数; 默认参数: 若存储
过程
需要参数而
调用
该参数
时
候不提供参数,则该存储
过程
无法
调用
。但是存在给参数设置默认参数,则不需要提供参数也可以
调用
存储
过程
; B)输出参数 在输入参数后面
加
OUTPUT关键词
调用
这个存储
过程
,在输出参数后必须
加
OUTPUT关键词; 补充:创建
Sql
Server 存储
过程
调用
存储
过程
接收输出参数,返回值
Sql
Server 存储
过程
调用
存储
过程
接收输出参数,返回值2017年06月02日 09:32:42阅读数:7800创建存储
过程
:[c-sharp] view plain copyCREATE PROCEDURE [
dbo
].[GetCustomers] (@rowcount INT OUTPUT) AS SELECT [CustomerID] ,[CompanyN...
JAVA
调用
SQL
存储
过程
详解
1使用不带参数的存储
过程
使用 JDBC 驱动程序
调用
不带参数的存储
过程
时
,必须使用 call
SQL
转义序列。不带参数的 call 转义序列的语法如下所示: {call procedure-name} 作为实例,在
SQL
Server 2005 Adve
MS-SQL Server
34,836
社区成员
254,634
社区内容
发帖
与我相关
我的任务
MS-SQL Server
MS-SQL Server相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章