Skip to content

Commit 19f6f4c

Browse files
committed
Merge branch 'master' of github.com:ChainSQL/chainsqld
2 parents 37d8f44 + cb96000 commit 19f6f4c

File tree

2 files changed

+198
-107
lines changed

2 files changed

+198
-107
lines changed

doc/RecordLevel.md

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
# 行级权限控制规则
2+
说明:
3+
1. 由于加密表在共识阶段Raw字段是无法解密的,无法判断行级控制条件的合法性,所以不同时支持加密表与行级控制功能
4+
5+
## 设计原则
6+
1. 灵活 可以单独使用某种规则,也可以自由组合使用
7+
2. 精细 可精确到控制每一行的增删改查规则,可控制插入条数、可修改字段
8+
9+
## 建表时指定增删改规则
10+
TableListSet的交易中添加一个新的字段**OperateRule**,示例如下:
11+
```
12+
{
13+
"OperationRule":{
14+
"Insert":{
15+
"Condition":{"account":"$account","txid":"$tx_hash"},
16+
"Count":{"AccountField":"account","CountLimit":5}
17+
},
18+
"Update":{
19+
"Condition":{"$or":[{"age":{"$le":28}},{"id":2}]},
20+
"Fields":["age"]
21+
},
22+
"Delete":{
23+
"Condition":{"account":"$account"}
24+
},
25+
"Get":{
26+
"Condition":{"id":{"$ge":3}}
27+
}
28+
}
29+
}
30+
```
31+
完整的建表交易:
32+
```
33+
{
34+
"method": "t_create",
35+
"params": [
36+
{
37+
"offline": false,
38+
"secret": "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb",
39+
"tx_json": {
40+
"TransactionType": "TableListSet",
41+
"Account": "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh",
42+
"Tables":[
43+
{
44+
"Table":{
45+
"TableName":"tableWithRule"
46+
}
47+
}
48+
],
49+
"OpType": 1,
50+
"Raw": [
51+
{"field":"id","type":"int","length":11,"PK":1,"NN":1,"UQ":1,"AI":1},
52+
{"field":"age","type":"int"},
53+
{"field":"name","type":"varchar","length":32},
54+
{"field":"account","type":"varchar","length":64},
55+
{"field":"txid","type":"varchar","length":64}
56+
],
57+
"OperationRule":{
58+
"Insert":{
59+
"Condition":{"account":"$account","txid":"$tx_hash"},
60+
"Count":{"AccountField":"account","CountLimit":5}
61+
},
62+
"Update":{
63+
"Condition":{"$or":[{"age":{"$le":28}},{"id":2}]},
64+
"Fields":["age"]
65+
},
66+
"Delete":{
67+
"Condition":{"account":"$account"}
68+
},
69+
"Get":{
70+
"Condition":{"id":{"$ge":3}}
71+
}
72+
}
73+
}
74+
}
75+
]
76+
}
77+
```
78+
## 详细说明:
79+
### Insert
80+
Insert中可设置Condition与Count两个字段的值:<br>
81+
**Condition**
82+
<br>指定插入操作可设置的默认值<br>
83+
如:
84+
```
85+
{'field1':0}
86+
```
87+
表示field1的默认值为0<br>
88+
有两个特殊的表示:
89+
```
90+
{'field2':$account}
91+
```
92+
表示field2的默认值为当前执行插入操作的账户地址
93+
```
94+
{'field3':$tx_hash}
95+
```
96+
表示field3的默认值为当前插入交易的hash值<br>
97+
98+
99+
**Count**<br>
100+
Count 可以限制每个账户可以插入的记录数<br>
101+
```
102+
{
103+
"Count":{"AccountField":"fieldName","CountLimit":10}
104+
}
105+
```
106+
以上条件中<br>
107+
AccountField指定建表字段中哪个字段为账户字段<br>
108+
CountLimit表示每个账户可插入几行(这里说的账户指的是AccountField指定的账户字段的值)
109+
110+
****
111+
1. 如果指定了默认值,插入时又指定了其它值,插入交易会执行失败<br>
112+
2. Insert中Condition与Count可同时使用,也可以只指定一个
113+
- 只指定Condition:指定一些字段的默认值
114+
- 只指定Count:这种情况下,插入者可以指定账户字段的值为其它账户,但是每个账户相关的记录还是会受条数限制影响。
115+
116+
### Update
117+
Update条件示例如下:
118+
```
119+
{
120+
"Condition":{"$or":[{"field2":{"$le":8}},{"field3":10}]},
121+
"Fields":["field1","field2"]
122+
}
123+
```
124+
**Condition**:<br>
125+
指定更新操作的条件,这个条件会在执行真正的更新交易时与更新交易的条件做‘and’操作,如:<br>执行下面的更新操作,将id=1的记录中的age的值更新为11:
126+
```
127+
{
128+
"method":"r_update",
129+
"params":[
130+
{
131+
"offline":false,
132+
"secret":"xxWFBu6veVgMnAqNf6YFRV2UENRd3",
133+
"tx_json":{
134+
"TransactionType":"SQLStatement",
135+
"Account":"z9VF7yQPLcKgUoHwMbzmQBjvPsyMy19ubs",
136+
"Owner":"zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh",
137+
"Tables":[
138+
{
139+
"Table":{
140+
"TableName":"tableWithRule"
141+
}
142+
}
143+
],
144+
"Raw":[
145+
{"age":11},
146+
{"id":1}
147+
],
148+
"OpType":8
149+
}
150+
}
151+
]
152+
}
153+
```
154+
结合行级控制里面的Update条件,最终的Raw字段会取值如下:
155+
```
156+
{
157+
"Raw":[
158+
{
159+
"age":11
160+
},
161+
{
162+
"$and":[
163+
{
164+
"id":1
165+
},
166+
{
167+
"$or":[
168+
{
169+
"field2":{"$le":8}
170+
},
171+
{
172+
"field3":10
173+
}
174+
]
175+
}
176+
]
177+
}
178+
]
179+
}
180+
```
181+
**Fields**<br>
182+
Fields指定了更新操作所能更新的字段,如果不添加Fields条件,默认可以更新表中所有字段<br>
183+
需要注意的是:<br>
184+
> 如Insert条件中某个字段在Count条件中被指定为账户字段,那这个字段是一定不能出现在Update条件的Fields中的,这种条件下必须显式的在Fields中将账户字段排除出去,否则会报**temBAD_OPERATIONRULE**错误
185+
186+
## Delete/Get
187+
Delete与Get操作只有Condition条件.<br>
188+
> 如Insert条件中某个字段在Count条件中被指定为账户字段,删除的Condition中必须显示指定操作账户字段为本账户字段:
189+
```
190+
{
191+
"Condition":{"account":"$account"}
192+
}
193+
```
194+
195+
196+
197+
198+

doc/RecordLevelCryptoAndAuthorization.md

Lines changed: 0 additions & 107 deletions
This file was deleted.

0 commit comments

Comments
 (0)