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中却没有能够授予创建函数权限的地方。
只能授予创建缺省值(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 能够完善这一点~