ASE中给用户授予创建函数的权限

Sybase ASE在15.0.2后支持用户自定义函数,但是只能返回标量值,且调用的时候必须在函数名前加创建者的用户名,这一点很不友好哦。数据库的dbowner默认就有创建函数的权限。普通的用户默认不具有创建函数的权限。

用户escourt4创建自定义函数的时候报下面的错误:

Msg 10331, Level 14, State 1:
Server 'TEST', Procedure 'datefmt_lzf', Line 4:
CREATE FUNCTION permission denied, database ultranms2, owner dbo

但是Sybase自动的客户端工具Sybase Central中却没有能够授予创建函数权限的地方。

Sybase Central中授予用户权限

只能授予创建缺省值(create default),创建过程(create procedure),创建规则(create rule),创建表(create table),创建视图(create view),创建加密密钥的权限。

可以看到在Sybase Central中不能为用户授予创建函数(create function) 的权限。这可能是Sybase Central的一个缺陷。

看来只能到命令行下对用户进行授予创建函数的权限了。

执行:

grant create function  to escourt4

go

这样就给用户escourt4授予了创建函数的权限了。验证一下escourt4是否被授予了create function的权限。

执行 sp_helprotect 或者 sp_helprotect escourt4 这两个命令都没有看到escourt4被授予create function的信息。
但是,escourt4的确已经具有了创建函数的权限了。 执行下面的创建一个简单函数的列子。

create function datefmt_lzf(@d datetime)
returns char(19)
as
  return str_replace(convert(char(19),@d,117),'/','-')
go

返回日期的格式为:yyyyy-mm-dd hh:mi:ss 如:2010-10-31 00:18:32

 

这样的话,怎么才能知道一个用户具有了创建函数的权限呢?

我初步估计是Sybase ASE一个小bug,导致不能正确的显示用户所拥有的权限。

验证方法如下:

1.既然在sp_helprotect不能正确的显示用户被授予create function的情况,先分析一下系统存储过程sp_helprotect的语法。发现这个过程内主要引用了:spt_values、sysattributes、sysprotects这三张系统表。

2. 建立一个文件,放在c:\1.txt ,内容如下:

select * from master..spt_values
go
select * from ultranms2..sysprotects
go
select * from ultranms2..sysattributes
go
 

3.在用户被授予create function 之前,在命令提示符下执行如下命令:

isql -Usa -P<sa_password> -S<server_name> -ic:\1.txt -oc:\before.txt

4.给用户授予create function的权限,用sa登录数据库,执行:

grant create function to escourt4

5.在命令提示符下执行:

isql -Usa -P<sa_password> -S<server_name> -ic:\1.txt -oc:\after.txt

6.命令提示符下执行:

fc c:\before.txt  c:\after.txt c:\compare_result.txt

打开比较结果c:\compare_result.txt文件,内容如下:

正在比较文件 before.txt 和 AFTER.TXT
***** before.txt
                   1

(56 rows affected)
 class  attribute object_type
***** AFTER.TXT
                   1
           0           4    280           1
         NULL                                                                                                                 
                                                                                                                              
                    
                   1

(57 rows affected)
 class  attribute object_type
*****

 

7.分析,通过上面的比较结果,发现在用户被授予创建函数的权限后,表sysprotects中增加了一条记录。

id,uid,action,protecttype,columns,grantor
0,4,280,1,,1
 

到官方文档中查看sysprotects表的action列都有什么权限列表,唯独没有看到280代表什么。

action列可以为以下权限之一:

151 = references 167 =set proxy 或set session authorization     221 = create trigger 222 = create proc 224 = execute
187 = set statistics on 188 = set statistics off     228 = dump database 233 =create default      
193 = select     235 =dump transaction      
195 = insert     236 = create rule      
196 = delete     253 = connect      
197 = update     282 = delete statistics      
198 = create table     317 = dbcc      
203 = create database     320 = truncate table      
205 = grant     326 = update statistics      
206 = revoke 207 = create view     347 = set tracing      

系统表sysprotects.action不包含create function,那其它的表spt_values,sysattributes呢?

通过搜索上面生成的before.txt和after.txt两个文件,都没有找到关于create function的内容。

难怪sp_helprotect不会显示关于用户是否被授予了create function的权限了,没有基础数据支持啊。 呵呵。

最后再次验证一下action=280表示权限:create function。

执行revoke create function from escourt4撤销刚才授予给用户escourt4的创建函数的权限。

再次查询一下sysprotects表,发现没有了action=280的那条记录。

ps:action=280表示创建函数(create function)的权限。希望Sybase 能够完善这一点~

 

  • 本文链接地址:http://www.dbainfo.net/ase-grant-create-function-privilege-to-user.htm
  • 本文为dbainfo个人原创,请在尊重作者劳动成果的前提下进行转载;
  • 转载务必注明原始出处 : Sybase数据库技术,数据库恢复专家
  • 对《ASE中给用户授予创建函数的权限》有何疑问或见解,请在本文下方发表;
  • 对网站还有其他问题或建议,请提交在留言板,谢谢!
  • 目前还没有任何评论.
    :wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)