可用版本: Dev (3.21) | 最新版 (3.20) | 3.19

实现

适用于 ❌ 开源版   ✅ 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();

引用此页

反馈

您对此页面有任何反馈吗? 我们很乐意听到您的反馈!

The jOOQ Logo