Pregunta: ¿Cuáles son algunas otras estrategias para evitar números mágicos o valores codificados en sus scripts SQL o procedimientos almacenados?SQL: evitando la codificación rígida o números mágicos
Considere un procedimiento almacenado cuyo trabajo es verificar/actualizar un valor de un registro basado en su StatusID
o alguna otra tabla de búsqueda FK o rango de valores.
considere una tabla Status
, donde la identificación es más importante, ya que es una FK a otra tabla:
Los scripts SQL que deben ser evitados son algo así como:
DECLARE @ACKNOWLEDGED tinyint
SELECT @ACKNOWLEDGED = 3 --hardcoded BAD
UPDATE SomeTable
SET CurrentStatusID = @ACKNOWLEDGED
WHERE ID = @SomeID
El problema aquí es que esto no es portátil y depende explícitamente del valor codificado. Existen defectos sutiles cuando se implementa esto en otro entorno con inserciones de identidad desactivadas.
también tratando de evitar una SELECT
basado en la descripción de texto/nombre del estado:
UPDATE SomeTable
SET CurrentStatusID = (SELECT ID FROM [Status] WHERE [Name] = 'Acknowledged')
WHERE ID = @SomeID
Pregunta: ¿Cuáles son algunas otras estrategias sobre cómo evitar los números mágicos o valores codificados de forma rígida en sus secuencias de comandos SQL o procedimientos almacenados?
Algunas otras ideas sobre cómo lograr esto:
- añadir una nueva columna
bit
(nombrado como 'IsAcknowledged') y conjuntos de reglas, donde no puede haber sólo una fila con un valor de1
. Esto ayudaría en la búsqueda de la fila única:SELECT ID FROM [Status] WHERE [IsAcknowledged] = 1)
Lo hago, excepto que mis tablas de búsqueda tienen una columna StatusText que se usa para mostrar, y una columna UniqueName que se usa para valores codificados. Esto permite que las solicitudes de los usuarios para cambiar la etiqueta que se muestra se puedan realizar sin afectar al UniqueName al que hacen referencia los valores codificados. – AaronLS
La única razón por la que tengo miedo de usar esta técnica es que no sé cuánto impacto tendrá a largo plazo en el rendimiento, hacer consultas en una columna de cadena en lugar de enteros. – AaronLS
Ok esto fue hace 7 meses. Como recuerdo, mi punto fue utilizar una unión en lugar de una sub consulta, que será más rápida. No tengo idea de dónde sacas la idea de que estoy consultando una cadena en lugar de un número entero. Esto funcionará mejor que el ejemplo en la pregunta, ya que es una combinación y no una subconsulta. – Hogan