O DMS integra a revisão de SQL e as sugestões de otimização às suas regras de segurança. No console SQL ou durante alterações de dados, esse recurso analisa as instruções SQL enviadas quanto à conformidade e fornece recomendações de otimização. Ele ajuda você a identificar e resolver problemas no SQL antes de confirmar as alterações, evitando possíveis falhas e exceções no banco de dados após a execução das instruções.
Pré-requisitos
Sua função no sistema é DBA ou administrator. Para mais informações, consulte Gerenciamento de usuários.
Você já criou uma regra de segurança. Para mais informações, consulte Criar uma regra de segurança.
-
Tipo de banco de dados:
MySQL: RDS for MySQL, PolarDB for MySQL, MariaDB, PolarDB-X, AnalyticDB for MySQL ou outras fontes MySQL
Oracle
PolarDB for PostgreSQL (Oracle Compatible)
OceanBase
Ações do sistema
O DMS oferece três ações predefinidas pelo sistema:
-
must be improved: Caso a instrução não seja aprimorada, o sistema bloqueia automaticamente o processo e exibe uma notificação. As regras iniciais de revisão de SQL não incluem nenhuma regra definida como must be improved.
NotaPara obter uma lista das verificações realizadas pelas regras de revisão de SQL, consulte Itens de verificação.
Por exemplo, se a regra
Tables must have a primary keyestiver definida comomust be improved, o sistema bloqueará a execução de uma instrução SQL que crie uma tabela sem chave primária. O desenvolvedor precisará modificar a instrução para passar na validação antes da execução. Problema potencial: Indica um problema na instrução SQL, mas não bloqueia o processo.
Melhoria sugerida: Recomenda uma melhoria, mas não bloqueia o processo.
Suporte a recursos em diferentes modos de controle
O DMS disponibiliza três modos de controle distintos. Para mais informações, consulte Modos de Controle.
|
Recurso |
Secure collaboration |
Stable change |
Flexible O&M |
|
Ativar ou desativar regras |
Suportado |
Suportado |
Suportado |
|
Configure ações |
Suportado |
Não configurável |
Não configurável |
|
Alterar parâmetros de regra Em algumas regras, é possível especificar parâmetros, como o número máximo de índices ou colunas em uma tabela. |
Suportado |
Suportado |
Não configurável |
|
Configure observações Defina o contexto de negócios de uma regra. |
Suportado |
Não configurável |
Não configurável |
Procedimento
Por padrão, cada regra de segurança inclui um conjunto de regras de revisão de SQL. Este exemplo demonstra como personalizar a configuração definindo a regra A table must have a primary key como must be improved.
Faça login no DMS 5.0.
-
Passe o ponteiro sobre o ícone
no canto superior esquerdo e escolha .NotaSe você utiliza o console do DMS no modo normal, escolha na barra de navegação superior.
-
Na coluna Actions da regra de segurança desejada, clique em Edit.
NotaPara definir configurações do modo Flexible Management ou Stable Change, clique em SQL audit optimization recommendations à direita do modo de controle correspondente.
No painel de navegação à esquerda da página Details, clique em SQL audit optimization recommendations.
-
Para a regra
A table must have a primary key, clique em Edit na coluna Actions.NotaÉ possível filtrar rapidamente as regras clicando no ícone
ao lado de Tag (escopo de aplicação da regra, incluindo instruções DDL e DML), Action ou Status (ativado ou desativado). -
Na caixa de diálogo Configure Rule Content, configure os seguintes parâmetros.
Os valores disponíveis para Action também incluem potential issue e suggested improvement.
Parâmetro
Descrição
Action
Defina Action como must be improved.
NotaPor padrão, nenhuma regra inicial está definida como must be improved.
Remarks
Insira observações para a regra, como o contexto de negócios.
-
Clique em OK.
Em tarefas subsequentes, como desenvolvimento de dados, alteração de dados e revisão de SQL, o DMS verifica suas instruções SQL com base nas regras de segurança configuradas.
Se uma instrução violar a regra
A table must have a primary key, o sistema bloqueará automaticamente o processo.
Itens de verificação
-
A SQL Specification Check abrange os seguintes itens.
Definição de esquema de tabela
Item de verificação
SQL aplicável
Nome e ID da regra
Atributos do banco de dados
CREATE DATABASERestringir o conjunto de caracteres na criação do banco de dados: CREATE_DATABASE_LIMIT_CHARSET
Atributos da tabela
-
CREATE TABLE -
ALTER TABLE
-
Tabelas devem ter chave primária: TABLE_MUST_HAVE_PRIMARY_KEY
-
Tabelas devem ter comentários: TABLE_MUST_HAVE_COMMENTS
-
Não usar chaves estrangeiras em tabelas: TABLE_FORBID_USE_FOREIGN_KEY
-
Restringir maiúsculas e minúsculas nos nomes das tabelas: TABLE_NAME_LIMIT_CHAR_CASE
-
Restringir o mecanismo de armazenamento das tabelas: TABLE_LIMIT_STORE_ENGINE
-
Não usar partições em tabelas: TABLE_FORBID_USE_PARTITION
-
Tabelas devem conter colunas específicas: TABLE_MUST_HAVE_SOME_COLUMN
-
Tabelas devem usar um conjunto de caracteres específico: TABLE_MUST_USE_SOME_CHARSET
-
Tabelas devem usar uma collation específica: TABLE_MUST_USE_SOME_COLLATION
-
Nomes de tabelas não podem ser palavras-chave: TABLE_NAME_FORBID_KEYWORD
-
Limitar o número de índices em uma tabela: TABLE_LIMIT_INDEX_COUNT
-
Limitar o número de colunas em uma tabela: TABLE_LIMIT_COLUMN_COUNT
-
Limitar o valor inicial de autoincremento de uma tabela: TABLE_LIMIT_INIT_AUTO_INCREMENT
-
A coluna de chave primária deve ser de autoincremento: LIMIT_PRIMARY_COLUMN_AUTO_INCREMENT
-
Não usar views: TABLE_FORBID_USE_VIEW
-
Não usar triggers: TABLE_FORBID_USE_TRIGGER
-
Não usar events: TABLE_FORBID_USE_EVENT
-
Não usar stored procedures: TABLE_FORBID_USE_STORED_PROCEDURE
-
Não usar funções personalizadas: TABLE_FORBID_USE_CUSTOM_FUNCTION
-
Usar a sintaxe
ALTER TABLE CONVERTpara modificar o conjunto de caracteres da tabela: MODIFY_CHARSET_USE_ALTER_TABLE_CONVERT
Atributos de coluna
-
CREATE TABLE -
ALTER TABLE
-
Nomes de colunas não podem ser palavras-chave: COLUMN_NAME_FORBID_KEYWORD
-
Restringir maiúsculas e minúsculas nos nomes das colunas: COLUMN_NAME_LIMIT_CHAR_CASE
-
Não definir conjunto de caracteres para uma coluna: COLUMN_FORBID_SET_CHARSET
-
Não usar determinados tipos de dados em colunas: COLUMN_FORBID_DATA_TYPES
-
Colunas devem ter comentários: COLUMN_MUST_HAVE_COMMENTS
-
Limitar o comprimento de colunas do tipo
char: COLUMN_LIMIT_CHAR_LENGTH -
Limitar o comprimento de colunas do tipo
varchar: COLUMN_LIMIT_VARCHAR_LENGTH -
Todas as colunas devem ser definidas como
NOT NULL: COLUMN_MUST_SET_NOT_NULL -
O nome da coluna de autoincremento deve ser
ID: COLUMN_AUTO_INCREMENT_NAME_ID -
Colunas de autoincremento devem ser unsigned: COLUMN_AUTO_INCREMENT_UNSIGNED
-
Não usar tipos
floatoudouble(usedecimalem vez disso): COLUMN_FORBID_FLOAT_DOUBLE_TYPE -
Cada coluna deve ter um valor padrão: EACH_COLUMN_NEED_DEFAULT_VALUE
-
Não definir collation para uma coluna: COLUMN_FORBID_SET_COLLATE
-
Não renomear colunas ao usar ALTER TABLE: ALTER_TABLE_FORBID_RENAME_COLUMN
-
Não remover colunas ao usar ALTER TABLE: ALTER_TABLE_FORBID_DROP_COLUMN
-
Não alterar tipos de dados ao usar ALTER TABLE: ALTER_TABLE_FORBID_MODIFY_DATA_TYPE
-
Novas colunas adicionadas com ALTER TABLE devem aceitar valores nulos: ALTER_TABLE_ADD_COLUMN_NULLABLE
-
Ao adicionar uma coluna não nula com ALTER TABLE, um valor padrão deve ser especificado: ALTER_ADD_NOT_NULL_COLUMN_NEED_DEFAULT
-
Ao alterar uma coluna que aceita nulos para não nula, um valor padrão deve ser especificado: COLUMN_NULLABLE_TO_NOT_NEED_DEFAULT
-
Não usar o tipo
enum(usetinyintoucharem vez disso): COLUMN_FORBID_USE_ENUM_TYPE -
Não usar o atributo
ZEROFILLem colunas: COLUMN_DATA_TYPE_FORBID_ZEROFILL
Atributos de índice
-
CREATE TABLE -
ALTER TABLE
-
Cada índice deve ter um nome explícito: INDEX_MUST_HAVE_CLEARLY_NAME
-
Restringir o padrão de nomenclatura para índices
Unique: UNIQUE_INDEX_NAME_PATTERN -
Restringir o padrão de nomenclatura para índices comuns: COMMON_INDEX_NAME_PATTERN
-
Limitar o número de colunas em um único índice: INDEX_LIMIT_CONTAINS_COLUMNS
-
Limitar o número de colunas em uma chave primária: PRIMARY_LIMIT_CONTAINS_COLUMNS
-
Restringir o tipo de dados das colunas de chave primária: PRIMARY_LIMIT_COLUMN_DATA_TYPE
-
Não remover a chave primária ao usar ALTER TABLE: ALTER_TABLE_FORBID_DROP_PRIMARY
-
Não remover um índice ao usar ALTER TABLE: ALTER_TABLE_FORBID_DROP_INDEX
Consulta de dados
Item de verificação
SQL aplicável
Nome e ID da regra
SELECT-
SELECT -
INSERT SELECT -
Subconsultas (aninhadas em instruções
UPDATEouDELETE)
-
Instruções
SELECTdevem especificar uma cláusulaWHERE: SELECT_SUGGEST_ASSIGN_WHERE -
Não usar
ORDER BY RAND()em instruçõesSELECT: SELECT_FORBID_USE_ORDER_BY_RAND -
Não usar
GROUP BYem uma constante em instruçõesSELECT: SELECT_FORBID_GROUP_BY_CONST -
Não usar
ORDER BYem uma constante em instruçõesSELECT: SELECT_FORBID_ORDER_BY_CONST -
Uma instrução
SELECTnão deve usarGROUP BYouORDER BYem tabelas diferentes: SELECT_FORBID_GROUP_ORDER_BY_DISTINCT_TABLE -
Em instruções
SELECT, não usarORDER BYpara classificar várias colunas em direções diferentes: SELECT_FORBID_ORDER_BY_MULTI_COLUMN_RANK -
Instrução
SELECT: Não usarGROUP BYouORDER BYem uma expressão ou função: SELECT_FORBID_GROUP_ORDER_BY_EXPR_OR_FUNCTION -
Não usar
UNIONem instruçõesSELECT: SELECT_FORBID_USE_UNION -
Limitar o número de tabelas unidas em uma instrução
SELECT: SELECT_LIMIT_TABLE_JOIN_COUNT -
Limite da instrução
SELECTno tamanho dooffsetda cláusulaLIMIT: SELECT_CONFINE_LIMIT_MAX_OFFSET -
Não usar cláusula
HAVINGem instruçõesSELECT: SELECT_FORBID_USE_HAVING
Cláusula
WHEREInstruções que contêm uma cláusula
WHERE, comoSELECT,UPDATE,DELETEeINSERT SELECT.-
Não aplicar operações matemáticas ou de função em colunas indexadas dentro de uma cláusula
WHERE: WHERE_FORBID_INDEX_COLUMN_HAS_MATH -
Não usar curinga inicial em buscas dentro de uma cláusula
WHERE: WHERE_FORBID_BEFORE_WILDCARD_SEARCH -
Verificar instruções
LIKEsem curinga na cláusulaWHERE: WHERE_CHECK_LIKE_HAS_NOT_WILDCARD -
Não usar condições negativas como
NOT INouNOT LIKEem uma cláusulaWHERE: WHERE_FORBID_USE_REVERSE_SEARCH -
Limite de elementos em uma cláusula
INdentro da cláusulaWHERE: WHERE_LIMIT_IN_ITEM_MAX_COUNT -
Verificar conversões implícitas de tipo em colunas de uma cláusula
WHERE: WHERE_CHECK_COLUMN_IMPLICIT_TYPE_CONVERSION -
Verificar condições de filtro vinculadas pelo operador
ORem uma cláusulaWHERE: WHERE_CHECK_OR_LINK_CONDITION
Alteração de dados
Item de verificação
SQL aplicável
Nome e ID da regra
Inserir dados
-
INSERT SELECT -
INSERT [IGNORE] -
REPLACE
-
Uma instrução
INSERTdeve especificar uma lista de colunas: ASSIGN_INSERT_COLUMN_NAME_LIST -
Não usar nomes de colunas duplicados na lista de colunas do
INSERT: INSERT_COLUMN_NAME_FORBID_DUPLICATE -
Não inserir um valor
NULLem uma colunaNOT NULL: NOT_NULL_COLUMN_FORBID_INSERT_NULL -
A lista de colunas deve corresponder à lista de valores em uma instrução
INSERT: INSERT_COLUMN_MUST_MATCH_VALUES -
Limitar o número total de linhas em uma única instrução
INSERT VALUES: LIMIT_INSERT_VALUES_TOTAL_ROWS -
Verificar se a tabela ou coluna especificada em uma instrução
INSERTexiste: INSERT_CHECK_TABLE_COLUMN_EXISTS -
Não usar a função
SYSDATE()em instruções de inserção: INSERT_FORBID_USE_SYSDATE_FUNCTION
Atualizar e excluir dados
-
UPDATE -
DELETE
-
Limitar o número de tabelas unidas em instruções
UPDATEouDELETE: UPDELETE_LIMIT_TABLE_JOIN_COUNT -
Instruções
UPDATEouDELETEdevem especificar uma cláusulaWHERE: UPDELETE_ASSIGN_WHERE_CONDITION -
Verificar se a cláusula
WHEREcontém uma subconsulta em instruçõesUPDATEouDELETE: UPDELETE_CHECK_WHERE_EXIST_SUB_QUERY -
Limitar o número de linhas afetadas usando
LIMITem instruçõesUPDATEouDELETE: UPDELETE_CHECK_LIMIT_AFFECTED_ROWS -
Detectar se a sintaxe de junção de múltiplas tabelas está completa em instruções
UPDATEouDELETE(por exemplo, se falta uma cláusulaonem uma cláusulajoin): UPDELETE_CHECK_TABLE_JOIN_LOSS_ON -
Não incluir cláusula
ORDER BYem instruçõesUPDATEouDELETE: UPDELETE_FORBID_ORDER_BY -
Verificação de instrução
UPDATE: delimitadorSETentre múltiplas colunas (andé inválido): UPDATE_CHECK_SET_ITEM_DELIMITER -
UPDATEem múltiplas tabelas: Verifica se as colunas na cláusulaSETestão especificadas com prefixo de tabela: UPDATE_MULTI_TABLE_CHECK_SET_COLUMN_PREFIX -
Verificar se as tabelas ou colunas em uma instrução
UPDATEexistem: UPDATE_CHECK_TABLE_COLUMN_EXIST -
Verificar se uma instrução
UPDATEmodifica a chave primária: UPDATE_CHECK_PRIMARY_KEY_CHANGE -
Verificar se uma instrução
UPDATEmodifica uma chave única: UPDATE_CHECK_UNIQUE_KEY_CHANGE -
Uma instrução
UPDATEtambém deve atualizar a coluna "hora de modificação" da tabela: UPDATE_ALSO_TO_UPDATE_MODIFY_TIME_COLUMN -
Não atualizar a coluna "hora de criação" da tabela em uma instrução
UPDATE: UPDATE_FORBID_MODIFY_CREATE_TIME_COLUMN
-
-
As Sugestões de Otimização de SQL incluem os seguintes itens de verificação.
Categoria
Item de verificação
Geral
-
Otimizar tabelas cuja chave primária é do tipo
int: OPTIMIZE_PRIMARY_IS_INT_TABLE -
Alertar sobre espaço restante insuficiente para chaves primárias de autoincremento: SNIFFING_AUTO_PRIMARY_REMAIN_SPACE
-
Alertar sobre risco de valores
NULLem uma chave única (UK): SNIFFING_UNIQUE_EXIST_NULL_RISK -
Alertar e otimizar bloqueios de tabela DDL ou falhas de alteração: ALTER_LOCK_FAIL_SNIFFING_OPTIMIZE
-
Detectar riscos de injeção de SQL: CHECK_SQL_INJECTION_RISK
-
Detectar riscos do uso de índices forçados
(FORCE INDEX): CHECK_SQL_ASSIGN_FORCE_INDEX -
Verificar o índice no plano de execução: SQL_EXPLAIN_INDEX_CHECK
-
Análise e sugestões de índice do DMS: DMS_INDEX_ANALYZE_AND_SUGGEST
-