DMS intègre la révision SQL et les suggestions d'optimisation à ses règles de sécurité. Dans la console SQL ou lors des modifications de données, cette fonctionnalité examine vos instructions SQL soumises pour vérifier leur conformité et fournit des recommandations d'optimisation. Elle vous aide à identifier et résoudre les problèmes liés au code SQL avant de valider les modifications, évitant ainsi des incidents potentiels et des anomalies de base de données après l'exécution des instructions.
Prérequis
Votre rôle système est DBA ou administrator. Pour plus d'informations, consultez la section Gestion des utilisateurs.
Vous avez créé une règle de sécurité. Pour en savoir plus, reportez-vous à la rubrique Créer une règle de sécurité.
-
Type de base de données :
MySQL : RDS for MySQL, PolarDB for MySQL, MariaDB, PolarDB-X, AnalyticDB for MySQL ou autres sources MySQL
Oracle
PolarDB for PostgreSQL (compatible Oracle)
OceanBase
Actions du système
DMS propose trois actions système prédéfinies :
-
must be improved : Si vous n'améliorez pas l'instruction, le système bloque automatiquement le processus et affiche une notification. Les règles initiales de révision SQL ne comportent aucune règle définie sur must be improved.
RemarquePour obtenir la liste des vérifications effectuées par les règles de révision SQL, consultez la section Éléments de vérification.
Par exemple, si la règle
Tables must have a primary keyest définie surmust be improved, le système bloquera l'exécution d'une instruction SQL créant une table sans clé primaire et exigera que le développeur modifie l'instruction afin qu'elle passe la validation avant exécution. Potential issue : Cette action signale un problème dans l'instruction SQL, mais elle ne bloque pas le processus.
Suggested improvement : Une amélioration est suggérée, mais elle ne bloque pas le processus.
Prise en charge de la fonctionnalité selon les différents modes de contrôle
DMS propose trois modes de contrôle différents. Pour plus de détails, voir Modes de contrôle.
|
Fonctionnalité |
Secure collaboration |
Stable change |
Flexible O&M |
|
Activer ou désactiver des règles |
Pris en charge |
Pris en charge |
Pris en charge |
|
Configurer les actions |
Pris en charge |
Non configurable |
Non configurable |
|
Modifier les paramètres des règles Pour certaines règles, vous pouvez spécifier des paramètres, tels que le nombre maximal d'index ou de colonnes dans une table. |
Pris en charge |
Pris en charge |
Non configurable |
|
Configurer les remarques Définir le contexte métier associé à une règle. |
Pris en charge |
Non configurable |
Non configurable |
Procédure
Par défaut, chaque règle de sécurité inclut un ensemble de règles de révision SQL. Cet exemple illustre la personnalisation de la configuration en définissant la règle A table must have a primary key sur must be improved.
Connectez-vous à DMS 5.0.
-
Placez le pointeur sur l'icône
située dans le coin supérieur gauche, puis choisissez .RemarqueSi vous utilisez la console DMS en mode normal, sélectionnez dans la barre de navigation supérieure.
-
Dans la colonne Actions correspondant à la règle de sécurité cible, cliquez sur Edit.
RemarquePour configurer les paramètres du mode Flexible Management ou Stable Change, cliquez sur SQL audit optimization recommendations à droite du mode de contrôle correspondant.
Dans le volet de navigation de gauche de la page Details, cliquez sur SQL audit optimization recommendations.
-
Pour la règle
A table must have a primary key, cliquez sur Edit dans la colonne Actions.RemarqueVous pouvez filtrer rapidement les règles en cliquant sur l'icône
située à côté de Tag (champ d'application de la règle, incluant les instructions DDL et DML), de Action ou de Status (activé ou désactivé). -
Dans la boîte de dialogue Configure Rule Content, configurez les paramètres suivants.
Les valeurs disponibles pour Action incluent également potential issue et suggested improvement.
Paramètre
Description
Action
Définissez Action sur must be improved.
RemarquePar défaut, aucune règle initiale n'est définie sur must be improved.
Remarks
Saisissez des remarques pour la règle, telles que le contexte métier.
-
Cliquez sur OK.
Lors des tâches ultérieures, telles que le développement de données, la modification de données et la révision SQL, DMS vérifie vos instructions SQL par rapport aux règles de sécurité configurées.
Si une instruction enfreint la règle
A table must have a primary key, le système bloque automatiquement le processus.
Éléments de vérification
-
SQL Specification Check comprend les éléments suivants.
Définition du schéma de table
Élément de vérification
Instruction SQL applicable
Nom et ID de la règle
Attributs de la base de données
CREATE DATABASERestreindre le jeu de caractères lors de la création d'une base de données : CREATE_DATABASE_LIMIT_CHARSET
Attributs de la table
-
CREATE TABLE -
ALTER TABLE
-
Une table doit posséder une clé primaire : TABLE_MUST_HAVE_PRIMARY_KEY
-
Une table doit contenir des commentaires : TABLE_MUST_HAVE_COMMENTS
-
Ne pas utiliser de clés étrangères dans les tables : TABLE_FORBID_USE_FOREIGN_KEY
-
Restreindre la casse des caractères pour les noms de table : TABLE_NAME_LIMIT_CHAR_CASE
-
Restreindre le moteur de stockage des tables : TABLE_LIMIT_STORE_ENGINE
-
Ne pas utiliser de partitions pour les tables : TABLE_FORBID_USE_PARTITION
-
Une table doit contenir des colonnes spécifiques : TABLE_MUST_HAVE_SOME_COLUMN
-
Une table doit utiliser un jeu de caractères spécifique : TABLE_MUST_USE_SOME_CHARSET
-
Une table doit utiliser un classement spécifique : TABLE_MUST_USE_SOME_COLLATION
-
Les noms de table ne doivent pas être des mots-clés : TABLE_NAME_FORBID_KEYWORD
-
Limiter le nombre d'index dans une table : TABLE_LIMIT_INDEX_COUNT
-
Limiter le nombre de colonnes dans une table : TABLE_LIMIT_COLUMN_COUNT
-
Limiter la valeur d'incrémentation automatique initiale d'une table : TABLE_LIMIT_INIT_AUTO_INCREMENT
-
La colonne de clé primaire doit être en incrémentation automatique : LIMIT_PRIMARY_COLUMN_AUTO_INCREMENT
-
Ne pas utiliser de vues : TABLE_FORBID_USE_VIEW
-
Ne pas utiliser de déclencheurs : TABLE_FORBID_USE_TRIGGER
-
Ne pas utiliser d'événements : TABLE_FORBID_USE_EVENT
-
Ne pas utiliser de procédures stockées : TABLE_FORBID_USE_STORED_PROCEDURE
-
Ne pas utiliser de fonctions personnalisées : TABLE_FORBID_USE_CUSTOM_FUNCTION
-
Utiliser la syntaxe
ALTER TABLE CONVERTpour modifier le jeu de caractères de la table : MODIFY_CHARSET_USE_ALTER_TABLE_CONVERT
Attributs de la colonne
-
CREATE TABLE -
ALTER TABLE
-
Les noms de colonne ne doivent pas être des mots-clés : COLUMN_NAME_FORBID_KEYWORD
-
Restreindre la casse des caractères pour les noms de colonne : COLUMN_NAME_LIMIT_CHAR_CASE
-
Ne pas définir de jeu de caractères pour une colonne : COLUMN_FORBID_SET_CHARSET
-
Ne pas utiliser certains types de données pour les colonnes : COLUMN_FORBID_DATA_TYPES
-
Les colonnes doivent comporter des commentaires : COLUMN_MUST_HAVE_COMMENTS
-
Limiter la longueur des colonnes de type
char: COLUMN_LIMIT_CHAR_LENGTH -
Limiter la longueur des colonnes de type
varchar: COLUMN_LIMIT_VARCHAR_LENGTH -
Toutes les colonnes doivent être définies sur
NOT NULL: COLUMN_MUST_SET_NOT_NULL -
Le nom de la colonne en incrémentation automatique doit être
ID: COLUMN_AUTO_INCREMENT_NAME_ID -
Les colonnes en incrémentation automatique doivent être non signées : COLUMN_AUTO_INCREMENT_UNSIGNED
-
Ne pas utiliser les types
floatnidouble(utilisezdecimalà la place) : COLUMN_FORBID_FLOAT_DOUBLE_TYPE -
Chaque colonne doit avoir une valeur par défaut : EACH_COLUMN_NEED_DEFAULT_VALUE
-
Ne pas définir de classement pour une colonne : COLUMN_FORBID_SET_COLLATE
-
Ne pas renommer les colonnes lors de l'utilisation d'ALTER TABLE : ALTER_TABLE_FORBID_RENAME_COLUMN
-
Ne pas supprimer les colonnes lors de l'utilisation d'ALTER TABLE : ALTER_TABLE_FORBID_DROP_COLUMN
-
Ne pas modifier les types de données lors de l'utilisation d'ALTER TABLE : ALTER_TABLE_FORBID_MODIFY_DATA_TYPE
-
Les nouvelles colonnes ajoutées avec ALTER TABLE doivent autoriser les valeurs NULL : ALTER_TABLE_ADD_COLUMN_NULLABLE
-
Lors de l'ajout d'une colonne non nullable avec ALTER TABLE, une valeur par défaut doit être spécifiée : ALTER_ADD_NOT_NULL_COLUMN_NEED_DEFAULT
-
Lors du changement d'une colonne nullable vers non nullable, une valeur par défaut doit être spécifiée : COLUMN_NULLABLE_TO_NOT_NEED_DEFAULT
-
Ne pas utiliser le type
enum(utiliseztinyintoucharà la place) : COLUMN_FORBID_USE_ENUM_TYPE -
Ne pas utiliser l'attribut
ZEROFILLpour les colonnes : COLUMN_DATA_TYPE_FORBID_ZEROFILL
Attributs de l'index
-
CREATE TABLE -
ALTER TABLE
-
Chaque index doit être nommé explicitement : INDEX_MUST_HAVE_CLEARLY_NAME
-
Restreindre le modèle de nommage pour les index
Unique: UNIQUE_INDEX_NAME_PATTERN -
Restreindre le modèle de nommage pour les index courants : COMMON_INDEX_NAME_PATTERN
-
Limiter le nombre de colonnes dans un seul index : INDEX_LIMIT_CONTAINS_COLUMNS
-
Limiter le nombre de colonnes dans une clé primaire : PRIMARY_LIMIT_CONTAINS_COLUMNS
-
Restreindre le type de données des colonnes de clé primaire : PRIMARY_LIMIT_COLUMN_DATA_TYPE
-
Ne pas supprimer la clé primaire lors de l'utilisation d'ALTER TABLE : ALTER_TABLE_FORBID_DROP_PRIMARY
-
Ne pas supprimer un index lors de l'utilisation d'ALTER TABLE : ALTER_TABLE_FORBID_DROP_INDEX
Requête de données
Élément de vérification
Instruction SQL applicable
Nom et ID de la règle
SELECT-
SELECT -
INSERT SELECT -
Sous-requêtes (imbriquées dans les instructions
UPDATEouDELETE)
-
Les instructions
SELECTdoivent spécifier une clauseWHERE: SELECT_SUGGEST_ASSIGN_WHERE -
Ne pas utiliser
ORDER BY RAND()dans les instructionsSELECT: SELECT_FORBID_USE_ORDER_BY_RAND -
Ne pas utiliser
GROUP BYsur une constante dans les instructionsSELECT: SELECT_FORBID_GROUP_BY_CONST -
Ne pas utiliser
ORDER BYsur une constante dans les instructionsSELECT: SELECT_FORBID_ORDER_BY_CONST -
Une instruction
SELECTne doit pas utiliserGROUP BYouORDER BYsur des tables différentes : SELECT_FORBID_GROUP_ORDER_BY_DISTINCT_TABLE -
Dans les instructions
SELECT, ne pas utiliserORDER BYpour trier plusieurs colonnes dans des directions différentes : SELECT_FORBID_ORDER_BY_MULTI_COLUMN_RANK -
Instruction
SELECT: Ne pas appliquerGROUP BYouORDER BYà une expression ou une fonction : SELECT_FORBID_GROUP_ORDER_BY_EXPR_OR_FUNCTION -
Ne pas utiliser
UNIONdans les instructionsSELECT: SELECT_FORBID_USE_UNION -
Limiter le nombre de tables jointes dans une instruction
SELECT: SELECT_LIMIT_TABLE_JOIN_COUNT -
Limitation de la taille du décalage (
offset) de la clauseLIMITdans l'instructionSELECT: SELECT_CONFINE_LIMIT_MAX_OFFSET -
Ne pas utiliser de clause
HAVINGdans les instructionsSELECT: SELECT_FORBID_USE_HAVING
Clause
WHEREInstructions contenant une clause
WHERE, telles queSELECT,UPDATE,DELETEetINSERT SELECT.-
Ne pas appliquer d'opérations mathématiques ou de fonctions aux colonnes indexées dans une clause
WHERE: WHERE_FORBID_INDEX_COLUMN_HAS_MATH -
Ne pas utiliser de caractère générique en tête dans les recherches au sein d'une clause
WHERE: WHERE_FORBID_BEFORE_WILDCARD_SEARCH -
Vérifier la présence d'instructions
LIKEsans caractère générique dans la clauseWHERE: WHERE_CHECK_LIKE_HAS_NOT_WILDCARD -
Ne pas utiliser de conditions négatives telles que
NOT INouNOT LIKEdans une clauseWHERE: WHERE_FORBID_USE_REVERSE_SEARCH -
Limitation du nombre d'éléments dans une clause
INau sein d'une clauseWHERE: WHERE_LIMIT_IN_ITEM_MAX_COUNT -
Vérifier les conversions de type implicites sur les colonnes dans une clause
WHERE: WHERE_CHECK_COLUMN_IMPLICIT_TYPE_CONVERSION -
Vérifier les conditions de filtre liées par l'opérateur
ORdans une clauseWHERE: WHERE_CHECK_OR_LINK_CONDITION
Modification de données
Élément de vérification
Instruction SQL applicable
Nom et ID de la règle
Insérer des données
-
INSERT SELECT -
INSERT [IGNORE] -
REPLACE
-
Une instruction
INSERTdoit spécifier une liste de colonnes : ASSIGN_INSERT_COLUMN_NAME_LIST -
Ne pas utiliser de noms de colonne en double dans la liste des colonnes de l'instruction
INSERT: INSERT_COLUMN_NAME_FORBID_DUPLICATE -
Ne pas insérer de valeur
NULLdans une colonneNOT NULL: NOT_NULL_COLUMN_FORBID_INSERT_NULL -
La liste des colonnes doit correspondre à la liste des valeurs dans une instruction
INSERT: INSERT_COLUMN_MUST_MATCH_VALUES -
Limiter le nombre total de lignes dans une seule instruction
INSERT VALUES: LIMIT_INSERT_VALUES_TOTAL_ROWS -
Vérifier l'existence de la table ou de la colonne spécifiée dans une instruction
INSERT: INSERT_CHECK_TABLE_COLUMN_EXISTS -
Ne pas utiliser la fonction
SYSDATE()dans les instructions d'insertion : INSERT_FORBID_USE_SYSDATE_FUNCTION
Mettre à jour et supprimer des données
-
UPDATE -
DELETE
-
Limiter le nombre de tables jointes dans les instructions
UPDATEouDELETE: UPDELETE_LIMIT_TABLE_JOIN_COUNT -
Les instructions
UPDATEouDELETEdoivent spécifier une clauseWHERE: UPDELETE_ASSIGN_WHERE_CONDITION -
Vérifier la présence d'une sous-requête dans la clause
WHEREdes instructionsUPDATEouDELETE: UPDELETE_CHECK_WHERE_EXIST_SUB_QUERY -
Limiter le nombre de lignes affectées en utilisant
LIMITdans les instructionsUPDATEouDELETE: UPDELETE_CHECK_LIMIT_AFFECTED_ROWS -
Détecte si la syntaxe de jointure multi-table est complète pour les instructions
UPDATEouDELETE(par exemple, une clausejoinmanque une clauseon) : UPDELETE_CHECK_TABLE_JOIN_LOSS_ON -
Ne pas inclure de clause
ORDER BYdans les instructionsUPDATEouDELETE: UPDELETE_FORBID_ORDER_BY -
Vérification de l'instruction
UPDATE: délimiteurSETentre plusieurs colonnes (andest invalide) : UPDATE_CHECK_SET_ITEM_DELIMITER -
UPDATEsur plusieurs tables : Vérifie si les colonnes de la clauseSETsont spécifiées avec un préfixe de table : UPDATE_MULTI_TABLE_CHECK_SET_COLUMN_PREFIX -
Vérifier l'existence des tables ou des colonnes dans une instruction
UPDATE: UPDATE_CHECK_TABLE_COLUMN_EXIST -
Vérifier si une instruction
UPDATEmodifie la clé primaire : UPDATE_CHECK_PRIMARY_KEY_CHANGE -
Vérifier si une instruction
UPDATEmodifie une clé unique : UPDATE_CHECK_UNIQUE_KEY_CHANGE -
Une instruction
UPDATEdoit également mettre à jour la colonne « heure de modification » de la table : UPDATE_ALSO_TO_UPDATE_MODIFY_TIME_COLUMN -
Ne pas mettre à jour la colonne « heure de création » de la table dans une instruction
UPDATE: UPDATE_FORBID_MODIFY_CREATE_TIME_COLUMN
-
-
Les suggestions d'optimisation SQL incluent les éléments de vérification suivants.
Catégorie
Élément de vérification
Aucune
-
Optimiser les tables dont la clé primaire est de type
int: OPTIMIZE_PRIMARY_IS_INT_TABLE -
Avertir en cas d'espace restant insuffisant pour les clés primaires en incrémentation automatique : SNIFFING_AUTO_PRIMARY_REMAIN_SPACE
-
Avertir du risque de valeurs
NULLdans une clé unique (UK) : SNIFFING_UNIQUE_EXIST_NULL_RISK -
Avertir et optimiser les verrous de table DDL ou les échecs de modification : ALTER_LOCK_FAIL_SNIFFING_OPTIMIZE
-
Détecter les risques d'injection SQL : CHECK_SQL_INJECTION_RISK
-
Détecter les risques liés à l'utilisation d'index forcés
(FORCE INDEX): CHECK_SQL_ASSIGN_FORCE_INDEX -
Vérifier l'index dans le plan d'exécution : SQL_EXPLAIN_INDEX_CHECK
-
Analyse et suggestions d'index DMS : DMS_INDEX_ANALYZE_AND_SUGGEST
-