DMS integra la revisión de SQL y las sugerencias de optimización en sus reglas de seguridad. En la consola de SQL o durante los cambios de datos, esta función revisa las instrucciones SQL enviadas para verificar su cumplimiento y proporciona sugerencias de optimización. Esto le permite identificar y resolver problemas en el código SQL antes de confirmar los cambios, lo que previene incidencias potenciales y excepciones en la base de datos tras la ejecución de las instrucciones.
Requisitos previos
Su rol en el sistema es DBA o administrator. Para obtener más información, consulte User Management.
Ha creado una regla de seguridad. Para obtener más información, consulte Create a security rule.
-
Tipo de base de datos:
MySQL: RDS for MySQL, PolarDB for MySQL, MariaDB, PolarDB-X, AnalyticDB for MySQL u otros orígenes MySQL
Oracle
PolarDB for PostgreSQL (Oracle Compatible)
OceanBase
Acciones del sistema
DMS proporciona tres acciones predefinidas del sistema:
-
must be improved: Si no mejora la instrucción, el sistema bloquea automáticamente el proceso y muestra una notificación. Las reglas iniciales de revisión de SQL no incluyen ninguna regla configurada como must be improved.
NotaPara consultar la lista de comprobaciones que realizan las reglas de revisión de SQL, véase Check items.
Por ejemplo, si la regla
Tables must have a primary keyestá configurada comomust be improved, el sistema bloqueará la ejecución de una instrucción SQL que cree una tabla sin clave primaria y exigirá al desarrollador modificar la instrucción para superar la validación antes de ejecutarla. Problema potencial: Indica un problema con la instrucción SQL, pero no bloquea el proceso.
Mejora sugerida: Se sugiere una mejora, pero no se bloquea el proceso.
Compatibilidad de funciones en los distintos modos de control
DMS ofrece tres modos de control diferentes. Para obtener más información, consulte Modos de control.
|
Función |
Secure collaboration |
Stable change |
Flexible O&M |
|
Habilitar o deshabilitar reglas |
Compatible |
Compatible |
Compatible |
|
Configurar acciones |
Compatible |
No configurable |
No configurable |
|
Modificar parámetros de reglas En algunas reglas, puede especificar parámetros como el número máximo de índices o columnas en una tabla. |
Compatible |
Compatible |
No configurable |
|
Configurar observaciones Configure el contexto empresarial de una regla. |
Compatible |
No configurable |
No configurable |
Procedimiento
De forma predeterminada, cada regla de seguridad incluye un conjunto de reglas de revisión de SQL. Este ejemplo muestra cómo personalizar la configuración estableciendo la regla A table must have a primary key como must be improved.
Inicie sesión en DMS 5.0.
-
Coloque el puntero sobre el icono
en la esquina superior izquierda y seleccione .NotaSi utiliza la consola de DMS en modo normal, seleccione en la barra de navegación superior.
-
En la columna Actions de la regla de seguridad deseada, haga clic en Edit.
NotaPara ajustar la configuración del modo Flexible Management o Stable Change, haga clic en SQL audit optimization recommendations a la derecha del modo de control correspondiente.
En el panel de navegación izquierdo de la página Details, haga clic en SQL audit optimization recommendations.
-
Para la regla
A table must have a primary key, haga clic en Edit en la columna Actions.NotaPuede filtrar rápidamente las reglas haciendo clic en el icono
junto a Tag (el ámbito donde aplica la regla, incluidas instrucciones DDL y DML), Action o Status (habilitado o deshabilitado). -
En el cuadro de diálogo Configure Rule Content, configure los siguientes parámetros.
Los valores disponibles para Action también incluyen potential issue y suggested improvement.
Parámetro
Descripción
Action
Establezca Action en must be improved.
NotaDe forma predeterminada, ninguna regla inicial está configurada como must be improved.
Remarks
Introduzca observaciones para la regla, como el contexto empresarial.
-
Haga clic en OK.
En tareas posteriores, como desarrollo de datos, cambio de datos y revisión de SQL, DMS comprueba sus instrucciones SQL con respecto a las reglas de seguridad configuradas.
Si una instrucción infringe la regla
A table must have a primary key, el sistema bloquea automáticamente el proceso.
Elementos de comprobación
-
SQL Specification Check incluye los siguientes elementos.
Definición del esquema de tabla
Elemento de comprobación
SQL aplicable
Nombre e ID de la regla
Atributos de base de datos
CREATE DATABASERestringir el juego de caracteres para la creación de bases de datos: CREATE_DATABASE_LIMIT_CHARSET
Atributos de tabla
-
CREATE TABLE -
ALTER TABLE
-
Una tabla debe tener clave primaria: TABLE_MUST_HAVE_PRIMARY_KEY
-
Una tabla debe tener comentarios: TABLE_MUST_HAVE_COMMENTS
-
No usar claves externas en tablas: TABLE_FORBID_USE_FOREIGN_KEY
-
Restringir mayúsculas y minúsculas en nombres de tabla: TABLE_NAME_LIMIT_CHAR_CASE
-
Restringir el motor de almacenamiento de las tablas: TABLE_LIMIT_STORE_ENGINE
-
No usar particiones en tablas: TABLE_FORBID_USE_PARTITION
-
Una tabla debe contener columnas específicas: TABLE_MUST_HAVE_SOME_COLUMN
-
Una tabla debe usar un juego de caracteres específico: TABLE_MUST_USE_SOME_CHARSET
-
Una tabla debe usar una intercalación específica: TABLE_MUST_USE_SOME_COLLATION
-
Los nombres de tabla no pueden ser palabras clave: TABLE_NAME_FORBID_KEYWORD
-
Limitar el número de índices en una tabla: TABLE_LIMIT_INDEX_COUNT
-
Limitar el número de columnas en una tabla: TABLE_LIMIT_COLUMN_COUNT
-
Limitar el valor inicial de incremento automático de una tabla: TABLE_LIMIT_INIT_AUTO_INCREMENT
-
La columna de clave primaria debe ser de incremento automático: LIMIT_PRIMARY_COLUMN_AUTO_INCREMENT
-
No usar vistas: TABLE_FORBID_USE_VIEW
-
No usar desencadenadores: TABLE_FORBID_USE_TRIGGER
-
No usar eventos: TABLE_FORBID_USE_EVENT
-
No usar procedimientos almacenados: TABLE_FORBID_USE_STORED_PROCEDURE
-
No usar funciones personalizadas: TABLE_FORBID_USE_CUSTOM_FUNCTION
-
Usar la sintaxis
ALTER TABLE CONVERTpara modificar el juego de caracteres de la tabla: MODIFY_CHARSET_USE_ALTER_TABLE_CONVERT
Atributos de columna
-
CREATE TABLE -
ALTER TABLE
-
Los nombres de columna no pueden ser palabras clave: COLUMN_NAME_FORBID_KEYWORD
-
Restringir mayúsculas y minúsculas en nombres de columna: COLUMN_NAME_LIMIT_CHAR_CASE
-
No establecer un juego de caracteres para una columna: COLUMN_FORBID_SET_CHARSET
-
No usar ciertos tipos de datos para columnas: COLUMN_FORBID_DATA_TYPES
-
Las columnas deben tener comentarios: COLUMN_MUST_HAVE_COMMENTS
-
Limitar la longitud de columnas de tipo
char: COLUMN_LIMIT_CHAR_LENGTH -
Limitar la longitud de columnas de tipo
varchar: COLUMN_LIMIT_VARCHAR_LENGTH -
Todas las columnas deben configurarse como
NOT NULL: COLUMN_MUST_SET_NOT_NULL -
El nombre de la columna de incremento automático debe ser
ID: COLUMN_AUTO_INCREMENT_NAME_ID -
Las columnas de incremento automático deben ser sin signo: COLUMN_AUTO_INCREMENT_UNSIGNED
-
No usar tipos
floatnidouble(usedecimalen su lugar): COLUMN_FORBID_FLOAT_DOUBLE_TYPE -
Cada columna debe tener un valor predeterminado: EACH_COLUMN_NEED_DEFAULT_VALUE
-
No establecer una intercalación para una columna: COLUMN_FORBID_SET_COLLATE
-
No cambiar el nombre de columnas al usar ALTER TABLE: ALTER_TABLE_FORBID_RENAME_COLUMN
-
No eliminar columnas al usar ALTER TABLE: ALTER_TABLE_FORBID_DROP_COLUMN
-
No cambiar tipos de datos al usar ALTER TABLE: ALTER_TABLE_FORBID_MODIFY_DATA_TYPE
-
Las nuevas columnas agregadas con ALTER TABLE deben admitir valores nulos: ALTER_TABLE_ADD_COLUMN_NULLABLE
-
Al agregar una columna que no admite nulos con ALTER TABLE, se debe especificar un valor predeterminado: ALTER_ADD_NOT_NULL_COLUMN_NEED_DEFAULT
-
Al cambiar una columna que admite nulos a una que no los admite, se debe especificar un valor predeterminado: COLUMN_NULLABLE_TO_NOT_NEED_DEFAULT
-
No usar el tipo
enum(usetinyintocharen su lugar): COLUMN_FORBID_USE_ENUM_TYPE -
No usar el atributo
ZEROFILLpara columnas: COLUMN_DATA_TYPE_FORBID_ZEROFILL
Atributos de índice
-
CREATE TABLE -
ALTER TABLE
-
Cada índice debe tener un nombre explícito: INDEX_MUST_HAVE_CLEARLY_NAME
-
Restringir el patrón de nombres para índices
Unique: UNIQUE_INDEX_NAME_PATTERN -
Restringir el patrón de nombres para índices comunes: COMMON_INDEX_NAME_PATTERN
-
Limitar el número de columnas en un solo índice: INDEX_LIMIT_CONTAINS_COLUMNS
-
Limitar el número de columnas en una clave primaria: PRIMARY_LIMIT_CONTAINS_COLUMNS
-
Restringir el tipo de datos de las columnas de clave primaria: PRIMARY_LIMIT_COLUMN_DATA_TYPE
-
No eliminar la clave primaria al usar ALTER TABLE: ALTER_TABLE_FORBID_DROP_PRIMARY
-
No eliminar un índice al usar ALTER TABLE: ALTER_TABLE_FORBID_DROP_INDEX
Consulta de datos
Elemento de comprobación
SQL aplicable
Nombre e ID de la regla
SELECT-
SELECT -
INSERT SELECT -
Subconsultas (anidadas en instrucciones
UPDATEoDELETE)
-
Las instrucciones
SELECTdeben especificar una cláusulaWHERE: SELECT_SUGGEST_ASSIGN_WHERE -
No usar
ORDER BY RAND()en instruccionesSELECT: SELECT_FORBID_USE_ORDER_BY_RAND -
No usar
GROUP BYsobre una constante en instruccionesSELECT: SELECT_FORBID_GROUP_BY_CONST -
No usar
ORDER BYsobre una constante en instruccionesSELECT: SELECT_FORBID_ORDER_BY_CONST -
Una instrucción
SELECTno debe usarGROUP BYuORDER BYen tablas diferentes: SELECT_FORBID_GROUP_ORDER_BY_DISTINCT_TABLE -
En instrucciones
SELECT, no usarORDER BYpara ordenar varias columnas en direcciones distintas: SELECT_FORBID_ORDER_BY_MULTI_COLUMN_RANK -
Instrucción
SELECT: No aplicarGROUP BYuORDER BYa una expresión o función: SELECT_FORBID_GROUP_ORDER_BY_EXPR_OR_FUNCTION -
No usar
UNIONen instruccionesSELECT: SELECT_FORBID_USE_UNION -
Limitar el número de tablas combinadas en una instrucción
SELECT: SELECT_LIMIT_TABLE_JOIN_COUNT -
Límite de la instrucción
SELECTsobre el tamaño deoffseten la cláusulaLIMIT: SELECT_CONFINE_LIMIT_MAX_OFFSET -
No usar una cláusula
HAVINGen instruccionesSELECT: SELECT_FORBID_USE_HAVING
Cláusula
WHEREInstrucciones que contienen una cláusula
WHERE, comoSELECT,UPDATE,DELETEeINSERT SELECT.-
No aplicar operaciones matemáticas o de función a columnas indexadas en una cláusula
WHERE: WHERE_FORBID_INDEX_COLUMN_HAS_MATH -
No usar comodines al inicio en búsquedas dentro de una cláusula
WHERE: WHERE_FORBID_BEFORE_WILDCARD_SEARCH -
Verificar instrucciones
LIKEsin comodín en la cláusulaWHERE: WHERE_CHECK_LIKE_HAS_NOT_WILDCARD -
No usar condiciones negativas como
NOT INoNOT LIKEen una cláusulaWHERE: WHERE_FORBID_USE_REVERSE_SEARCH -
Límite en una cláusula
WHEREsobre el número de elementos en una cláusulaIN: WHERE_LIMIT_IN_ITEM_MAX_COUNT -
Verificar conversiones implícitas de tipo en columnas dentro de una cláusula
WHERE: WHERE_CHECK_COLUMN_IMPLICIT_TYPE_CONVERSION -
Verificar condiciones de filtro vinculadas por el operador
ORen una cláusulaWHERE: WHERE_CHECK_OR_LINK_CONDITION
Cambio de datos
Elemento de comprobación
SQL aplicable
Nombre e ID de la regla
Insertar datos
-
INSERT SELECT -
INSERT [IGNORE] -
REPLACE
-
Una instrucción
INSERTdebe especificar una lista de columnas: ASSIGN_INSERT_COLUMN_NAME_LIST -
No usar nombres de columna duplicados en la lista de columnas de
INSERT: INSERT_COLUMN_NAME_FORBID_DUPLICATE -
No insertar un valor
NULLen una columnaNOT NULL: NOT_NULL_COLUMN_FORBID_INSERT_NULL -
La lista de columnas debe coincidir con la lista de valores en una instrucción
INSERT: INSERT_COLUMN_MUST_MATCH_VALUES -
Limitar el número total de filas en una sola instrucción
INSERT VALUES: LIMIT_INSERT_VALUES_TOTAL_ROWS -
Comprobar si existe la tabla o columna especificada en una instrucción
INSERT: INSERT_CHECK_TABLE_COLUMN_EXISTS -
No usar la función
SYSDATE()en instrucciones de inserción: INSERT_FORBID_USE_SYSDATE_FUNCTION
Actualizar y eliminar datos
-
UPDATE -
DELETE
-
Limitar el número de tablas combinadas en instrucciones
UPDATEoDELETE: UPDELETE_LIMIT_TABLE_JOIN_COUNT -
Las instrucciones
UPDATEoDELETEdeben especificar una cláusulaWHERE: UPDELETE_ASSIGN_WHERE_CONDITION -
Verificar si la cláusula
WHEREcontiene una subconsulta en instruccionesUPDATEoDELETE: UPDELETE_CHECK_WHERE_EXIST_SUB_QUERY -
Limitar el número de filas afectadas mediante
LIMITen instruccionesUPDATEoDELETE: UPDELETE_CHECK_LIMIT_AFFECTED_ROWS -
Detectar si la sintaxis de combinación de múltiples tablas está completa en instrucciones
UPDATEoDELETE(por ejemplo, si falta una cláusulaonen una cláusulajoin): UPDELETE_CHECK_TABLE_JOIN_LOSS_ON -
No incluir una cláusula
ORDER BYen instruccionesUPDATEoDELETE: UPDELETE_FORBID_ORDER_BY -
Comprobación de instrucción
UPDATE: DelimitadorSETentre múltiples columnas (andno es válido): UPDATE_CHECK_SET_ITEM_DELIMITER -
UPDATEen múltiples tablas: Verifica si las columnas en la cláusulaSETse especifican con un prefijo de tabla: UPDATE_MULTI_TABLE_CHECK_SET_COLUMN_PREFIX -
Verificar si existen las tablas o columnas en una instrucción
UPDATE: UPDATE_CHECK_TABLE_COLUMN_EXIST -
Verificar si una instrucción
UPDATEmodifica la clave primaria: UPDATE_CHECK_PRIMARY_KEY_CHANGE -
Verificar si una instrucción
UPDATEmodifica una clave única: UPDATE_CHECK_UNIQUE_KEY_CHANGE -
Una instrucción
UPDATEtambién debe actualizar la columna de "hora de modificación" de la tabla: UPDATE_ALSO_TO_UPDATE_MODIFY_TIME_COLUMN -
No actualizar la columna de "hora de creación" de la tabla en una instrucción
UPDATE: UPDATE_FORBID_MODIFY_CREATE_TIME_COLUMN
-
-
Las sugerencias de optimización de SQL incluyen los siguientes elementos de comprobación.
Categoría
Elemento de comprobación
Ninguna
-
Optimizar tablas donde la clave primaria es de tipo
int: OPTIMIZE_PRIMARY_IS_INT_TABLE -
Advertir sobre espacio restante insuficiente para claves primarias de incremento automático: SNIFFING_AUTO_PRIMARY_REMAIN_SPACE
-
Advertir sobre el riesgo de valores
NULLen una clave única (UK): SNIFFING_UNIQUE_EXIST_NULL_RISK -
Advertir y optimizar bloqueos de tabla DDL o fallos de cambio: ALTER_LOCK_FAIL_SNIFFING_OPTIMIZE
-
Detectar riesgos de inyección SQL: CHECK_SQL_INJECTION_RISK
-
Detectar riesgos por el uso de índices forzados
(FORCE INDEX): CHECK_SQL_ASSIGN_FORCE_INDEX -
Verificar el índice en el plan de ejecución: SQL_EXPLAIN_INDEX_CHECK
-
Análisis y sugerencias de índices de DMS: DMS_INDEX_ANALYZE_AND_SUGGEST
-