函数视图
函数视图提供了一种灵活的方式来控制用户访问数据库和表。函数视图是封装了访问数据库以及相关计算语句的自定义函数。用户即使不具备读写数据库原始数据的权限,也可通过执行函数视图,间接访问数据库,得到所需计算结果。
封装自定义函数
DolphinDB 支持将用户自定义函数封装为函数视图。
定义
首先定义用户自定义函数。
def myFunc(){
print "myFunc"
}
再通过 addFunctionView 函数将自定义函数封装为函数视图。
addFunctionView(udf=myFunc)
getFunctionViews()
name | body |
---|---|
myFunc |
def myFunc(){ print("myFunc") } |
删除
通过 dropFunctionView 函数可以删除已有的函数视图。
dropFunctionView(name="myFunc")
封装模块
DolphinDB 支持将模块添加为函数视图,用户可以按照命名空间管理函数视图。
定义
在 [home]/modules/dir1/myModule 文件中定义函数,并在文件第一行声明为模块,文件内容如下:
module dir1::myModule
def f1(){
print "dir1::myModule::f1"
}
def f2(){
print "dir1::myModule::f2"
}
使用 use 语句引用模块后,可通过 addFunctionView
函数将该模块中所有函数添加为函数视图。
login(userId=`admin, password=`123456)
use dir1::myModule
addFunctionView(moduleName="dir1::myModule")
getFunctionViews()
name | body |
---|---|
dir1::myModule::f1 |
def f1(){ print("dir1::myModule::f1") } |
dir1::myModule::f2 |
def f2(){ print("dir1::myModule::f2")} |
删除
通过 dropFunctionView
函数删除函数视图时,即可指定删除某一个视图,也可根据命名空间批量删除。
// 删除函数视图 dir1::myModule::f1
dropFunctionView(name="dir1::myModule::f1")
// 删除名称空间 dir1::myModule 下所有函数视图
dropFunctionView(name="dir1::myModule",isNamespace=true)
获取函数视图
管理员用户执行 getFunctionViews 函数可以获取当前系统的所有用户创建的函数视图,拥有 VIEW_OWNER 权限的用户执行该函数只返回该用户创建的函数视图。
dropFunctionView
函数删除函数视图。示例
用户 user1 不具有读取分布式表 dfs://db1/pt 的权限。通过将函数getAvg
定义为函数视图,并赋予用户 user1
执行该视图的权限,user1 可以在没有读取分布式表 dfs://db1/pt1 的权限的情况下,得到该表中 value 列每天的平均值。
// 创建分布式表 dfs://db1/pt 并模拟数据
login(userId=`admin, password=`123456)
db = database(directory="dfs://db1", partitionType=VALUE,
partitionScheme=2024.01.01..2024.01.10)
t = table(stretch(2024.01.01..2024.01.10,100) as date, rand(1000,100) as val)
pt = createPartitionedTable(dbHandle=db, table=t, tableName="pt",
partitionColumns="date")
pt.tableInsert(t)
// 定义函数 getAvg ,并将其设置为函数视图
def getAvg(){
return select avg(val) from loadTable(database="dfs://db1", tableName="pt") group by date
}
login(userId=`admin, password=`123456)
addFunctionView(udf=getAvg)
// 创建用户 user1,并赋予其执行函数视图 getAvg 的权限
createUser(userId=`user1, password=`123456)
grant(userId=`user1, accessType=VIEW_EXEC, objs="getAvg")
// 用户 user1 由于没有权限无法直接读取表中数据
login(userId=`user1, password=`123456)
select avg(val) from loadTable(database="dfs://db1", tableName="pt") group by date
// <NoPrivilege>Not granted to read table dfs://db1/pt
// 用户 user1 调用函数视图可以获取每天的平均值
getAvg()
date | avg_val |
---|---|
2024.01.01 | 438 |
2024.01.02 | 447.6 |
2024.01.03 | 499.6 |
2024.01.04 | 355.2 |
2024.01.05 | 551.9 |
2024.01.06 | 330.2 |
2024.01.07 | 366.5 |
2024.01.08 | 547.9 |
2024.01.09 | 473 |
2024.01.10 | 369.2 |
注:由于 value 的值是随机生成的,多次执行的结果中 avg_val 可能不一致,这符合预期。