Domanda: Quali sono alcune altre strategie per evitare numeri magici o valori codificati nei propri script SQL o stored procedure?SQL: evitare codici di codifica o numeri magici
Considerare una stored procedure il cui compito è controllare/aggiornare un valore di un record basato sul suo StatusID
o un'altra tabella di ricerca FK o un intervallo di valori.
consideri un tavolo Status
dove l'ID è più importante, in quanto è un FK a un altro tavolo:
Gli script SQL che devono essere evitati sono qualcosa come:
DECLARE @ACKNOWLEDGED tinyint
SELECT @ACKNOWLEDGED = 3 --hardcoded BAD
UPDATE SomeTable
SET CurrentStatusID = @ACKNOWLEDGED
WHERE ID = @SomeID
Il problema qui è che questo non è portatile ed è esplicitamente dipendente dal valore hardcoded. Esistono dei difetti sottili quando lo si distribuisce in un altro ambiente con gli inserti di identità disattivati.
cercando anche di evitare una SELECT
sulla base della descrizione del testo/nome dello stato:
UPDATE SomeTable
SET CurrentStatusID = (SELECT ID FROM [Status] WHERE [Name] = 'Acknowledged')
WHERE ID = @SomeID
Domanda: Quali sono alcune altre strategie su come evitare numeri magici o valori hard-coded nei vostri script SQL o stored procedure?
Alcuni altri pensieri su come raggiungere questo obiettivo:
- aggiungere una nuova colonna di
bit
(denominata come 'IsAcknowledged') e insiemi di regole in cui ci può essere una sola riga con un valore di1
. Questo aiuterebbe a trovare la fila unica:SELECT ID FROM [Status] WHERE [IsAcknowledged] = 1)
Faccio questo, ma le mie tabelle di ricerca hanno una colonna StatusText che viene utilizzata per la visualizzazione e una colonna UniqueName che viene utilizzata per i valori con hardcoded. Ciò consente alle richieste dell'utente di modificare l'etichetta visualizzata senza eseguire l'UniqueName a cui fanno riferimento i valori codificati. – AaronLS
L'unica ragione per cui temo di utilizzare questa tecnica, è che non so quanto abbia un impatto a lungo termine sulle prestazioni, per eseguire query su una colonna di stringhe invece che su un intero. – AaronLS
Ok, questo è stato 7 mesi fa. Ricordo che il mio punto era usare un join invece di una sottoquery, che sarà più veloce. Non ho idea di dove ti venga l'idea che sto interrogando su una stringa invece che su un intero. Ciò funzionerà meglio dell'esempio nella domanda poiché si tratta di un join e non di una sottoquery. – Hogan