全部產品
Search
文件中心

ApsaraDB for SelectDB:查詢攔截

更新時間:Jul 06, 2024

本文介紹ApsaraDB for SelectDB提供的SQL查詢攔截相關功能,協助您進行SQL管理。

概述

在生產環境的部分情境下,需要對可執行檔SQL語句做出限制,例如屏蔽刪除或某些已知的高風險查詢語句。為滿足此類情境需求,SelectDB提供了SQL查詢攔截功能。當您在SelectDB上執行的SQL命中了攔截規則,SelectDB將不允許該SQL執行,並返回錯誤資訊。

建立攔截規則

建立SQL攔截規則可用於限制任何SQL語句(包括DDL和DML語句)。支援按資料庫帳號配置SQL黑名單。

SQL攔截規則可通過以下方式進行配置:

  • 通過正則匹配的方式拒絕指定的SQL。

  • 通過設定partition_num、tablet_num、cardinality,檢查一個查詢是否達到其中一個限制。這幾個查詢配置項可以同時設定,一旦查詢觸發其中任何一個限制,就會觸發攔截。

文法

CREATE SQL_BLOCK_RULE rule_name 
[PROPERTIES ("key"="value", ...)];

參數說明

參數名稱

必填

參數說明

rule_name

規則名稱。

PROPERTIES

具體屬性,詳細說明請參見下文。

常用的PROPERTIES參數如下。

參數名稱

必填

參數說明

sql

匹配規則(基於正則匹配,特殊字元需要轉譯。如select *使用select \\*),預設值為NULL,最後無需帶分號。

sqlHash

SQL Hash值,用於完全符合。預設值為NULL。fe.audit.log將會記錄這個值,這個參數和sql只能二選一。

partition_num

一個掃描節點會掃描的最大Partition數量。預設值為0L,不限制。

tablet_num

一個掃描節點會掃描的最大Tablet數量。預設值為0L,不限制。

cardinality

一個掃描節點粗略的掃描行數。預設值為0L,不限制

global

是否全域(對所有使用者)生效。預設值為false

enable

是否開啟阻止規則。預設值為true

使用樣本

  • 建立一個名稱為test_rule的阻止規則,樣本如下。

    CREATE SQL_BLOCK_RULE test_rule 
    PROPERTIES(
      "sql"="select \\* from order_analysis",
      "global"="false",
      "enable"="true",
      "sqlHash"=""
    )

    當執行SQL名字上述攔截規則時,會返回如下錯誤提醒。

    SELECT * FROM order_analysis;
    ERROR 1064 (HY000): errCode = 2, detailMessage = sql match regex sql block rule: order_analysis_rule
  • 建立test_rule2,將最大掃描的分區數量限制在30個,最大掃描基數限制在100億行,樣本如下。

    CREATE SQL_BLOCK_RULE test_rule2 
    PROPERTIES
    (
       "partition_num" = "30",
       "cardinality" = "10000000000",
       "global" = "false",
       "enable" = "true"
    );
    Query OK, 0 rows affected (0.01 sec)
  • 建立包含特殊字元的SQL BLOCK RULE,樣本如下。Regex中()符號是特殊符號,所以需要轉義。

    CREATE SQL_BLOCK_RULE test_rule3
    PROPERTIES
    ( 
        "sql" = "select count\\(1\\) from test_db.test_table"
    );
    
    CREATE SQL_BLOCK_RULE test_rule4
    PROPERTIES
    ( 
        "sql" = "select \\* from db1.tbl1"
    );

查看攔截規則

查看已配置的SQL阻止規則,不指定規則名則為查看所有規則。

文法

SHOW SQL_BLOCK_RULE [FOR RULE_NAME];

參數說明

參數名稱

必填

參數說明

rule_name

規則名稱。

使用樣本

  • 查看所有規則,樣本如下。

    SHOW SQL_BLOCK_RULE;
    +------------+------------------------+---------+--------------+-----------+-------------+--------+--------+
    | Name       | Sql                    | SqlHash | PartitionNum | TabletNum | Cardinality | Global | Enable |
    +------------+------------------------+---------+--------------+-----------+-------------+--------+--------+
    | test_rule  | select * from order_analysis | NULL    | 0            | 0         | 0           | true   | true   |
    | test_rule2 | NULL                   | NULL    | 30           | 0         | 10000000000 | false  | true   |
    +------------+------------------------+---------+--------------+-----------+-------------+--------+--------+
    2 rows in set (0.01 sec)
  • 指定規則名查詢,樣本如下。

    SHOW SQL_BLOCK_RULE FOR test_rule2;
    +------------+------+---------+--------------+-----------+-------------+--------+--------+
    | Name       | Sql  | SqlHash | PartitionNum | TabletNum | Cardinality | Global | Enable |
    +------------+------+---------+--------------+-----------+-------------+--------+--------+
    | test_rule2 | NULL | NULL    | 30           | 0         | 10000000000 | false  | true   |
    +------------+------+---------+--------------+-----------+-------------+--------+--------+
    1 row in set (0.00 sec)

修改攔截規則

修改SQL攔截規則,允許對規則的每一項屬性進行修改。

文法

ALTER SQL_BLOCK_RULE rule_name 
[PROPERTIES ("key"="value", ...)];

參數說明

參數名稱

必填

參數說明

rule_name

規則名稱。

PROPERTIES

具體屬性,詳細說明請參見上文建立攔截規則

使用樣本

  1. 根據SQL屬性進行修改,樣本如下。

ALTER SQL_BLOCK_RULE test_rule PROPERTIES("sql"="select \\* from test_table","enable"="true")
  1. 如果一個rule設定了partition_num,那麼sql或者sqlHash將無法被修改,樣本如下。

ALTER SQL_BLOCK_RULE test_rule2 PROPERTIES("partition_num" = "10","tablet_num"="300","enable"="true")

刪除攔截規則

刪除SQL阻止規則,支援同時刪除多條規則。

文法

DROP SQL_BLOCK_RULE test_rule1,...

參數說明

參數名稱

必填

參數說明

test_rule1

規則名稱。支援多規則,以“,”隔開。

使用樣本

刪除test_rule1、test_rule2阻止規則,樣本如下。

DROP SQL_BLOCK_RULE test_rule1,test_rule2;
Query OK, 0 rows affected (0.00 sec)

攔截規則綁定使用者

如果需要為指定資料庫帳號配置攔截規則,則需要設定規則的屬性global為false,然後參考如下語句進行綁定,多個規則使用,分隔。

SET PROPERTY [FOR 'jack'] 'sql_block_rules' = 'test_rule1,test_rule2';