4. 行级控制
建表时可以对增删改查权限分别进行条件设置,只有满足条件的记录方可被操作,精确度到行(见示意图) 。
应用场景:在我们做业务的时候,经常会出现多个用户通过ChainSQL访问同一张表的情况,为了防止用户对表的数据随意修改,我们提出了行级控制的概念,通过在建表时指定操作条件,可以将对表的操作力度控制在行级。
目前支持的功能:
插入:
1.指定某列默认插入当前操作账户
2.指定某列默认插入交易的hash值
3.设置插入条数限制
更新:
1.设置可更新字段集合
2.设置更新条件
删除:设置删除条件(若设置了插入条数限制条件,删除条件中必须做相应的账户设置)
查询:设置查询条件
举例说明:
建表时指定行级控制规则如下:
{
"tx_json": {
"TransactionType": "TableListSet",
"Account": "zP8Mum8xaGSkypRgDHKRbN8otJSzwgiJ9M",
"Tables":[
{
"Table":{
"TableName":"tableWithRule"
}
}
],
"OpType": 1,
"Raw": [
{"field":"id","type":"int","length":11,"PK":1,"NN":1,"UQ":1},
{"field":"age","type":"int"},
{"field":"name","type":"varchar","length":32},
{"field":"account","type":"varchar","length":64},
{"field":"txid","type":"varchar","length":64}
],
"OperationRule":{
"Insert":{
"Condition":{"account":"$account","txid":"$tx_hash"},
"Count":{"AccountField":"account","CountLimit":5}
},
"Update":{
"Condition":{"$or":[{"age":{"$le":28}},{"id":2}]},
"Fields":["age"]
},
"Delete":{
"Condition":{"account":"$account"}
},
"Get":{
"Condition":{"id":{"$ge":3}}
}
}
}
}
以上命令中指定的增删改查条件如下:
插入:
1.account字段值为执行插入交易时的账户地址,不写会自动填充
2.Txid字段值为执行插入交易时的交易hash值,不写会自动填充
3.每个账户最多只能插入5条数据到表中
更新:
1.只能更新表中的age字段
2.只能更新age <= 28 或 id=2的记录
删除: 删除记录A的账户必须与记录A中account字段的值一致(与插入条数对应)
查询:只有满足id >=3的记录才能被查询出来
注意事项: 使用行级控制功能的不能为加密表
案例:
百望发票项目:
“税务+区块链”应用采用API接口的方式进行集成。区块链接口满足的业务包括:
1. 创建wallet接口
2. 查询wallet ID接口
3. 发票写入接口
4. 发票读取接口
5. 发票状态维护接口
接口形式:Restful
信息流向:
1. from:baiwang
2. to1:消费者
3. to2:销货企业
4. to3:报销入账企业
项目应用的行级控制功能:
1.插入的限制条件to2字段值必须与插入账户相同:
{
"Insert":{
"Condition":{"to2":"$account"}
}
}
说明:Condition指定插入交易的账户地址("Account"的值)必须与交易中Raw字段的to2字段值值相同
2.更新目前可以限制更新字段与更新条件:
{
"Update":{
"Condition":{"$or":[{"to2":"$account"},{"to3":"$account"}]},
"Fields":["state"]
}
}
Condition指定更新满足的条件:to2的值等于当前交易(Update)的账户地址 或 to3的值等于当前交易(Update)的账户地址
Fields字段指定更新只能更新state字段
3.查询条件
{
"Condition":{"$or":[{"to1":"$account"},{"to2":"$account"},{"to3":"$account"}]}
}
说明:只有to1/to2/to3指定的用户可以查询本条记录
最终OperationRule取值:
{
"Insert":{
"Condition":{"to2":"$account"}
},
"Update":{
"Condition":{"$or":[{"to2":"$account"},{"to3":"$account"}]},
"Fields":["STATE"]
},
"Get":{
"Condition":{"$or":[{"to1":"$account"},{"to2":"$account"},{"to3":"$account"}]}
}
}