Estándares de Programación SQL SERVER
Estándares de Programación SQL SERVER
Tabla de contenido
1 INTRODUCCIÓN ................................................................................................................................ 1
1.1 Descripción. .................................................................................................... 1
1.2 Objetivo de los Estándares ............................................................................. 1
1.3 Personal Responsable .................................................................................... 1
2 BASE DE DATOS............................................................................................................................... 3
2.1 Políticas Generales ......................................................................................... 3
2.1.1 Pase de Desarrollo a Producción ............................................................... 3
2.2 Test a los Objetos de base de datos............................................................... 5
2.3 Recomendaciones de programación .............................................................. 5
3 DISEÑO DE LA BASE DE DATOS .................................................................................................... 6
3.1 Generalidades ................................................................................................ 6
3.2 Reglas para nombrar Tablas .......................................................................... 8
3.3 Reglas para nombrar Campos ........................................................................ 9
3.4 Reglas para nombrar Procedimientos Almacenados .................................... 10
3.5 Reglas para nombrar Funciones. .................................................................. 11
3.6 Reglas para nombrar Trigger. ....................................................................... 12
3.7 Reglas para nombrar Jobs. ........................................................................... 12
3.8 Reglas para nombrar las VISTAS. ................................................................ 13
3.9 Formato para documentar objetos. ............................................................... 13
4 RECOMENDACIONES ..................................................................................................................... 14
4.1 TIP para programación en T-SQL ................................................................. 17
4.1.1 Lectura ..................................................................................................... 17
4.1.2 Joins......................................................................................................... 17
4.1.3 Where ...................................................................................................... 18
4.1.4 Generales ................................................................................................ 19
4.1.5 Transaccionalidad .................................................................................... 19
1 Introducción
1.1 Descripción.
El presente manual de estándares comprende las normas de estándares técnicos
aplicables al diseño lógico, diseño físico y construcción de la base de datos y sistema
de seguridad bajo el entorno Microsoft SQL y las herramientas de desarrollo
Microsoft Visual Studio.
Analista
Diseño Lógico de Base de Datos
Tablas
Campos
Restricción de tablas
Vistas
Vistas Materializadas
Secuencias
Sistemas de Seguridad
Usuarios
Grupos y Jerarquías
Privilegios
Auditoria
Programador
Lenguaje T-SQL
Lenguaje ASP-NET
Report Services
2 Base de Datos
Todo objeto de base de datos nuevos que fueron creados sin haber
informado al responsable o DBA, serán borrados sin previa
comunicación, y se procederá a informar al analista de sistemas con
copia a la jefatura por medio de un correo indicando la acción realizada.
Ejemplo:
Existen casos donde se realiza una consulta a la misma tabla dentro del
SELECT
"SELECT columna1, (SELECT columna5 FROM Tabla1 WHERE
columna9=522) as columna5, columna6 FROM Tabla1 columna9=522", es
recomendable utilizarse un LEFT JOIN.
Para el uso de tablas temporales, la cantidad de los datos que debe albergar
no debe ser mayor a 5000 registros, debido que este objeto hace uso
exclusivamente de la memoria.
3.1 Generalidades
Nomenclatura:
Ejemplo:
Ejemplo:
tb_ges_saldoDiario
Ejemplo:
La tabla de “Transacciones de clientes” se denominaría de la
siguiente forma:
tb_ges_transaccionCliente
Ejemplo:
tb_ges_cliente_direccion
ide
Tipo de Objeto Descripción
Objeto
Tabla destino, cuya fuente es originado
Td SQL Table
de una fuente externa de datos (ETL)
Tabla base de configuración o maestras
Tb SQL Table
internas propias de la aplicación
Tabla agrupadora, originada como un
Ta SQL Table resumen de una/s tabla/s destino, para
una optimizar la emisión de los reportes.
Tabla temporal, usada para almacenar
temporalmente los datos en un
Tt SQL Table procesamiento o generación de reportes,
el contenido puede ser borrado en
proceso de limpieza.
Tabla intermedia, imagen de una tabla
fuente externa, usada para acelerar la
Ti SQL Table
carga y usar procedimientos almacenados
trasformas los datos en proceso de ETL
Tk SQL Table Tablas Backup
Pk SQL Index Índice primario
Ak SQL Index Índice alterno
Ámbito del
Descripción
Negocio
ges Gestión
gen Procedimientos y funciones generales
seg Seguridad
tar Tareas de ejecución de ETL
Sistemas, para uso de documentación y procedimiento
sis generales como utilitarios de desarrollo o
mantenimiento.
ren Rentabilidad
cum Seguimiento de indicadores de cumplimiento
cua Cuaderno de gestión
pre Sistema presupuestal (bifopres)
spr Seguimiento de propuestas
Cualquier otro ámbito de negocios debe estar inscrita en
*
la tabla de tb_seg_aplicacion
Toda tabla debe tener uno o más campos clave "PRIMARY KEY".
Los campos son libres y deberá ser lo más explícito que se pueda, usar guiones
para separar palabras y no excederse del 32 caracteres, no use caracteres
especiales como palabras acentuadas , eñe o símbolos, los nombres deben de
ser en singular.
Existen prefijos que resumen la primera palabra del campo, son de 3 caracteres
que indican la función del campo y los demás caracteres que expresen el detalle,
siempre escrita con letra minúscula, este estándar debe prevalecer ya que el
mismo será utilizado en el entorno de desarrollo y ayudara a disminuir el tiempo
en el control de seguimiento.
Prefijo Descripción
can Cantidad
cod Código
des Descripción
dir Dirección
est Estado
fec Fecha
grp Grupo
ide Identificador
imp Importe
nom Nombre
num Número
por Porcentaje
tip Tipo
tot Total
var Variación
Ejemplo:
Ejemplo:
Ejemplo:
Ejemplo: up_ges_sel_deudaCantidadFactura.
Acción Descripción
sel Mostrar un listado de los
datos.
Usado para funciones
SQL tipo Tabla-Valor
cal Retorna un resultado de
una operación.
Tabla 004: Acciones para las Funciones
Ejemplo:
Acción Descripción
ins Se ejecutará cuando se realice un INSERT.
upd Se ejecutará cuando se realice un UPDATE.
del Se ejecutará cuando se realice un DELETE.
cud Se ejecutará cuando se realice un insert, update o
delete.
Ejemplo:
Ejemplo:
Ejemplo:
Se necesita crear una vista para listar los registros de los clientes con
factura el nombre podría ser: vw_ges_clienteNuevo.
Ejemplo: vw_ges_clienteVinculado
-- =============================================
-- Author: jmieses
-- Create date: 06/02/2012
-- Description: Actualiza la maestra de Aplicación
-- Updates: 06/02/2013 fcossio @001 Agrego el campo
-- tip_apliccion
-- =============================================
-- INICIO @001
SELECT * FROM tt_ges_prueba
-- FINAL @001
4 Recomendaciones
Las recomendaciones que se muestran a continuación, han sido dadas por el equipo de
Sistemas de Gerencia Total SAC y recogidas por BANBIF:
Todo cambio sobre la BD (campo, tabla, índice, etc.) deben ser notificados a una
persona encargada o DBA, el cual a su vez notificará al resto del personal, es
recomendable la utilización de un correo para el control.
Decimal vs Float. Ventajas: Decimal es un tipo de dato propietario del motor, las
operaciones aritméticas con este tipo primero las procesa el motor, luego pasa al
procesador, mientras que las operaciones con un float, integer y smallint lo realiza
directamente el procesador, sin embargo la ventaja de Decimal es la longitud en los
decimales, es decir que ya realiza la función de redondeo al almacenar, por ello es más
usado.
Llaves primarias. Ventajas: Las llaves primarias crean un índice de tipo UNIQUE,
refuerza la integridad de la información. Por definición de integridad las llaves primarias
no aceptan nulos.
TODO query debe acceder las tablas usando índices (salvo que el SQL decida no
usarlos). Esto implica que TODA tabla, incluyendo a las temporales, debe tener un Índice
Clustered. Opcionalmente se pueden colocar uno más Índices NonClustered.
Ejemplo
No usar: WHERE CONVERT(VARCHAR(10),fec_poliza,121) = "20051201"
Usar : WHERE fec_poliza = CONVERT(DATETIME,"20051201",121)
En la cláusula WHERE nunca usar operadores con columnas de una tabla. Los
operadores colocarlos sobre la constante con la se va a comparar.
Ejemplo
No usar: WHERE num_poliza + 600 = @variable_poliza
Usar : WHERE num_poliza = @variable_poliza - 600
Toda tabla temporal debe ser borrada, no deben existir tablas con tt_ en las Bases de
Datos de Producción.
Cada Stored Procedure debe llevar en la cabecera, el nombre del autor, la fecha y una
breve descripción del objetivo del SP.
Evitar querys dinámicos concatenando valores separados por comas, como por
Ejemplo:
DELETE FROM td_ges_direccion WHERE cod_direccion IN (#1, #2, #3,..#N)
En lugar de esto colocar los valores en una tabla de tal forma que se pueda hacer
cruces con otras tablas, como por
Ejemplo:
DELETE td_ges_direccion
FROM DIRECCIONES, #tt_ges_temporal
WHERE td_ges_direccion.cod_direccion =
#tt_ges_temporal.cod_direccion
4.1.1 Lectura
Evita usar SELECT *. Siempre lee solo las columnas que necesitas. Con esto
evitas llevar mucha data que no se necesita al cliente, entonces se
descongestiona la red y el cliente siente que es más rápido.
Evite usar SELECT … INTO table_name. Esto bloqueará tablas del sistema.
En lugar de esto, crea primero las tablas y luego re-escribe la sentencia
como INSERT INTO table_name SELECT ...
Si vas a leer data de una sola tabla, evita hacerlo usando vistas que usan
otras tablas.
4.1.2 Joins
Escribe Joins en formato ANSI (usa la cláusula JOIN .. ON). Con esto te aseguras
de escribir todas las restricciones sin posibilidad de olvidarte de alguna restricción.
Evita usar la misma tabla más de una vez en un solo query. Para mejorar esto, usa
tablas temporales.
Usa
SELECT member_number, first_name, last_name, room_number
FROM members m
INNER JOIN rooms r
ON m.room_number = r.room_number
En lugar de usar una sentencia con muchos Joins donde las tablas involucradas son
grandes, mejor crea una tabla temporal con los datos de la tabla principal (códigos)
y luego actualiza esta tabla haciendo Joins con las tablas secundarias.
SELECT nom_publisher
FROM tb_gen_publisher
WHERE cod_publisher IN
(SELECT cod_publisher FROM tb_gen_title)
Usa:
SELECT nom_publisher
FROM tb_gen_publisher
INNER JOIN tb_gen_title
ON tb_gen_title.cod_publisher = tb_gen_ publisher.cod_publisher
4.1.3 Where
Usa:
Usa
SELECT customer_number, customer_name
FROM customer
WHERE customer_number BETWEEN 1000 and 1004
Evita usar los operadores OR, NOT IN, NOT BETWEEN, <>, NOT EXISTS, NOT
LIKE, LIKE ‘%ABC’
Si un query tiene uno a más operadores OR, considera reescribir el query en varios
Queries y une los resultados usando el operador UNION. Recuerda de usar
“UNION ALL”, si es posible.
4.1.4 Generales
Evita usar cursores. En lugar usa tablas temporales con un campo entero
identity(1,1) el cual podrás barrer en forma secuencial. No olvides indexar el campo
identity.
Considera que las funciones MIN y MAX pueden usar índices. Si es posible crea
índices sobre las columnas sobre las cuales se usan estas funciones.
Revisa cada query de un stored procedure asegúrate que no haga “table scan”
(búsqueda no indexada). Para estudiar esto activa la directiva “Show Query Plan” en
el “Query Analyzer”.
Trata de cada query haga uso de un índice sobre una columna que tenga una alta
dispersión.
4.1.5 Transaccionalidad
Procura que tus transacciones sean pequeñas, es decir que acceden a la menor
cantidad de páginas de la base de datos.
Evita declarar una sola gran transacción para los procesos en lote. Mejor es tener
varias transacciones pequeñas y manejar reprocesos.