CREATE SQL_BLOCK_RULE
Описание
Эта инструкция используется для создания правила блокировки SQL.
SQL_BLOCK_RULE позволяет запрещать пользователям определённые операции, например сканирование больших объёмов данных.
Синтаксис
CREATE SQL_BLOCK_RULE <rule_name>
PROPERTIES (
-- property
<property>
-- Additional properties
[ , ... ]
)
Обязательные параметры
1. <rule_name>
Имя правила.
2. <property>
Свойства правила делятся на три категории: выполнение SQL, ограничения сканирования и переключатели.
Категории выполнения SQL и ограничений сканирования взаимоисключающие: одно правило блокировки SQL может задавать ограничения только для одной из них.
Категория выполнения SQL
Доступны два типа сопоставления: по регулярному выражению и точное. Можно выбрать только один из них.
- sql: Правило сопоставления на основе регулярного выражения. Специальные символы необходимо экранировать: например,
select *следует записывать какselect \\*. Когда пользователь выполняет инструкцию SQL, система использует заданный здесь SQL как регулярное выражение для сопоставления с SQL, отправленным пользователем. При совпадении выполнение SQL блокируется.- sqlHash: Хеш MD5 инструкции SQL. Используется главным образом совместно с журналами медленных запросов. Пользователям не нужно самостоятельно вычислять хеш. Например, если журнал медленных запросов показывает, что определённый SQL выполняется медленно, можно скопировать
SqlHashизfe.audit.logи создать SQL_BLOCK_RULE, чтобы ограничить выполнение этого SQL.Категория ограничений сканирования Когда пользователь отправляет запрос, оптимизатор запросов вычисляет для каждой таблицы количество партиций, tablet и строк данных, которые необходимо просканировать. Следующие свойства позволяют ограничить все три показателя одновременно или только некоторые из них.
- partition_num: Максимальное количество партиций, сканируемых в одной таблице.
- tablet_num: Максимальное количество tablet, сканируемых в одной таблице.
- cardinality: Количество строк данных, сканируемых в одной таблице.
- require_partition_filter: Требуется ли для запроса к партиционированной внутренней таблице или таблице Hive действенный фильтр по партициям. Если установлено значение
true, запросы, сканирующие поддерживаемую партиционированную таблицу без фильтрации по столбцу партиционирования, блокируются. Значение по умолчанию —false. Это свойство поддерживается в Doris начиная с версии 4.0.7 в серии 4.0 и начиная с версии 4.1.4 в серии 4.1. В настоящее время оно действует только для внутренних таблиц и таблиц Hive.Категория переключателей
- global: Действует ли правило для всех пользователей. Значение по умолчанию — false. Если значение true не установлено, правило необходимо применить к конкретному пользователю с помощью команды
set property.- enable: Включено ли правило блокировки. Значение по умолчанию — true.
Требования к правам доступа
Пользователь, выполняющий эту команду SQL, должен иметь как минимум следующие права:
| Привилегия | Объект | Примечания |
|---|---|---|
| ADMIN_PRIV | Глобальный уровень |
Примеры
-
Создание правила, запрещающего всем пользователям выполнять
select * from order_analysisCREATE SQL_BLOCK_RULE test_rule
PROPERTIES(
"sql"="select \\* from order_analysis",
"global"="true",
"enable"="true"
);При выполнении SQL, заданного в правиле, возвращается ошибка, как показано ниже:
mysql> select * from order_analysis;
ERROR 1064 (HY000): errCode = 2, detailMessage = sql match regex sql block rule: test_rule -
Создание правила, запрещающего сканировать более 30 партиций одной таблицы и ограничивающего объём данных запроса до 10 миллиардов строк
CREATE SQL_BLOCK_RULE test_rule2
PROPERTIES
(
"partition_num" = "30",
"cardinality" = "10000000000",
"global" = "true",
"enable" = "true"
); -
Сопоставление SQL основано на регулярных выражениях. Чтобы охватить больше вариантов SQL, необходимо составить соответствующие регулярные выражения. Например, следующее правило игнорирует пробельные символы в SQL и запрещает запросы к таблицам, имена которых начинаются с "order":
CREATE SQL_BLOCK_RULE test_rule3
PROPERTIES(
"sql"="\\s*select\\s*\\*\\s*from order_\\w*\\s*",
"global"="true",
"enable"="true"
); -
Создание правила, действующего только для определённых пользователей
CREATE SQL_BLOCK_RULE test_rule4
PROPERTIES(
"sql"="select \\* from order_analysis",
"global"="false",
"enable"="true"
);Применение правила к пользователю jack
SET PROPERTY FOR 'jack' 'sql_block_rules' = 'test_rule4'; -
Создание правила, требующего включать фильтр по партициям в запросы к партиционированным внутренним таблицам и таблицам Hive
CREATE SQL_BLOCK_RULE test_rule5
PROPERTIES(
"require_partition_filter"="true",
"global"="true",
"enable"="true"
);После включения правила запрос к поддерживаемой партиционированной таблице без фильтра по столбцу партиционирования будет заблокирован:
SELECT * FROM partitioned_table;
ERROR 1105 (HY000): errCode = 2, detailMessage = sql hits sql block rule: test_rule5, missing partition filterЗапросы с действенным фильтром по партициям по-прежнему могут выполняться:
SELECT * FROM partitioned_table WHERE dt = '2024-01-01';
Прочее
Ниже приведены распространённые регулярные выражения:
Копировать текст
. : Matches any single character except the newline character `\n`.
* : Matches the preceding element zero or more times. For example, a* matches zero or more 'a's.
+ : Matches the preceding element one or more times. For example, a+ matches one or more 'a's.
? : Matches the preceding element zero or one time. For example, a? matches zero or one 'a'.
[] : Defines a character set. For example, [aeiou] matches any vowel.
[^] : When used in a character set, ^ indicates negation, matching characters not in the set. For example, [^0-9] matches any non-digit character.
() : Groups expressions, allowing quantifiers to be applied to them. For example, (ab)+ matches consecutive 'ab's.
| : Indicates logical OR. For example, a|b matches 'a' or 'b'.
^ : Matches the beginning of a string. For example, ^abc matches strings starting with 'abc'.
$ : Matches the end of a string. For example, xyz$ matches strings ending with 'xyz'.
\ : Escapes special characters, making them ordinary characters. For example, \\. matches the period character '.'.
\s : Matches any whitespace character, including spaces, tabs, newlines, etc.
\d : Matches any digit character, equivalent to [0-9].
\w : Matches any word character, including letters, digits, and underscores, equivalent to [a-zA-Z0-9_].