实现
适用于 ❌ 开源版 ✅ Express 版 ✅ 专业版 ✅ 企业版
策略在渲染你的 jOOQ 查询时实现。 它总是以有意义的方式将 Policy
条件添加到查询中,这意味着行会被从查询中过滤掉。
应用 Policy
永远不会抛出任何异常! 策略只会过滤掉查询或 DML 语句的行。
如果策略实现了 TENANT.TENANT_ID = 42
,我们可能会编写如下查询
SELECT
SELECT CUSTOMER.ID, CUSTOMER.NAME FROM CUSTOMER WHERE CUSTOMER.TENANT_ID = 42
create.select(CUSTOMER.ID, CUSTOMER.NAME) .from(CUSTOMER) .fetch();
INSERT
INSERT
的情况很奇怪,因为单行 INSERT .. VALUES 语句实际上没有插入任何内容(产生 0
的更新计数)是不寻常的,但在策略下这是完全有道理的。
INSERT INTO CUSTOMER (ID, NAME, TENANT_ID) SELECT t.ID, t.NAME, t.TENANT_ID FROM ( -- These are the values from the VALUES () clause SELECT 1, 'John Doe', 42 ) t (ID, NAME, TENANT_ID) -- This is the policy condition WHERE t.TENANT_ID = 42
create.insertInto(CUSTOMER) .columns( CUSTOMER.ID, CUSTOMER.NAME, CUSTOMER.TENANT_ID) .values( 1, "John Doe", 42) .execute();
上面的例子表明,插入的 CUSTOMER.TENANT_ID
值必须与策略条件中的值匹配,否则,该行将不会被插入。
UPDATE
策略以两种方式应用于 UPDATE
语句。 首先,通过 WHERE
子句,防止更新无法被选择的行
UPDATE CUSTOMER SET NAME = 'John Doe' WHERE CUSTOMER.ID = 5 AND CUSTOMER.TENANT_ID = 42
create.update(CUSTOMER) .set(CUSTOMER.NAME, "John Doe") .where(CUSTOMER.ID.eq(5)) .execute();
但是,如有必要,也可以应用于 SET
子句,防止在更新后更新不允许的值。
UPDATE CUSTOMER SET TENANT_ID = 1 WHERE CUSTOMER.ID = 5 -- Preventing access to some rows AND CUSTOMER.TENANT_ID = 42 -- Preventing updates to certain values AND 1 = 42
create.update(CUSTOMER) .set( CUSTOMER.TENANT_ID, 1 ) .where(CUSTOMER.ID.eq(5)) .execute();
看起来很奇怪的谓词 1 = 42
是通过将 SET
子句元素 TENANT_ID = 1
替换为策略条件 CUSTOMER.TENANT_ID = 42
来实现的。 如果策略允许 CUSTOMER.TENANT_ID IN (1, 42)
,那么更新将再次合法
UPDATE CUSTOMER SET TENANT_ID = 1 WHERE CUSTOMER.ID = 5 -- Preventing access to some rows AND CUSTOMER.TENANT_ID IN (1, 42) -- Preventing updates to certain values AND 1 IN (1, 42)
create.update(CUSTOMER) .set( CUSTOMER.TENANT_ID, 1 ) .where(CUSTOMER.ID.eq(5)) .execute();
DELETE
策略仅影响 DELETE
语句的 WHERE
子句,类似于 SELECT
语句的 WHERE
子句。
DELETE FROM CUSTOMER WHERE CUSTOMER.ID = 5 AND CUSTOMER.TENANT_ID = 42
create.deleteFrom(CUSTOMER) .where(CUSTOMER.ID.eq(5)) .execute();
反馈
您对此页面有任何反馈吗? 我们很乐意听到您的反馈!