Ayer me sentí frustrado por la falta de sincronización de la base de datos. Las bibliotecas utilizadas para el desarrollo y las pruebas no son las mismas. En la biblioteca desarrollada, los procedimientos almacenados se actualizan con frecuencia. A veces incluso cambia la estructura de la tabla.
Esto lleva a muchos problemas. Por un tiempo, no sabía cuál era el problema específico, lo que me hizo sentir muy avergonzado. De repente quise escribir un programa para comparar las diferencias entre las dos bibliotecas para facilitar las pruebas y la implementación.
Esta mañana estaba escribiendo durante una reunión y pasé la prueba al mediodía.
Principalmente dos declaraciones SQL:
El SQL con diferentes estructuras de tablas y vistas y atributos de columnas en la biblioteca de consultas es el siguiente:
seleccione A. [nombre] como Nombre de tabla,
B. [nombre] como Colname,
tipo B.x,
B.xusertype,
B. longitud,
B.colido,
B.cdefault,
B.dominio,
B.número,
B.compensado,
B. estado,
tipo B,
B.tipo de usuario,
B.prec,
B. escala,
B.se calcula,
B.isoutparam,
B. anulable,
C.COLUMN_DEFAULT,
dbo.fnIsColumnPrimaryKey(B. [ID], B. [nombre]) como PKey
de sysobjects A, syscolumns B, INFORMACIÓN_ESQUEMA .COLUMNAS C
donde a.id = B.id
y A.xtype en ('u', 'v')
y A. Nombre = C.TABLE_NAME
y B. Nombre = C.COLUMN_NAME
ordenar por A. [ID], B. [Nombre]
///////
El significado de cada columna es el siguiente.
name sysname Nombre de columna o nombre de un parámetro de procedimiento.
id int El ID del objeto de tabla al que pertenece esta columna, o el ID del procedimiento almacenado asociado con este parámetro.
xtype tinyint Tipo de almacenamiento físico en systypes.
typestat tinyint Sólo para uso interno.
xusertype smallint ID de tipo de datos extendido definido por el usuario.
length smallint Longitud máxima de almacenamiento físico en tipos de sistemas.
xprec tinyint Sólo para uso interno.
xscale tinyint Sólo para uso interno.
columna colid smallint o ID de parámetro.
xoffset smallint Sólo para uso interno.
bitpos tinyint Sólo para uso interno.
reservado tinyint Sólo para uso interno.
colstat smallint Sólo para uso interno.
cdefault int El ID del valor predeterminado de esta columna.
dominio int La regla o ID de restricción CHECK de esta columna.
number smallint El número de subproceso cuando el proceso está agrupado (0 indica elementos que no son de proceso).
Colorder Smallint Sólo para uso interno.
autoval varbinary(255) Sólo para uso interno.
offset smallint El desplazamiento de la fila en la que se encuentra esta columna, si es negativo, indica una fila de longitud variable.
status tinyint Mapa de bits que describe los atributos de columna o parámetro:
0x08 = La columna permite valores nulos.
0x10 = El relleno ANSI está vigente al agregar una columna varchar o varbinary. Conserva los espacios finales para las columnas varchar y los ceros finales para las columnas varbinary.
0x40 = El parámetro es un parámetro de SALIDA.
0x80 = La columna es una columna de identidad.
escriba tinyint El tipo de almacenamiento físico en systypes.
usertype smallint ID de tipo de datos definido por el usuario en systypes.
printfmt varchar(255) Sólo para uso interno.
prec smallint El nivel de precisión de esta columna.
escala int Número de decimales para esta columna.
iscomputed int Bandera que indica si la columna ha sido calculada:
0 = no calculado.
1 = Calculado.
isoutparam int indica si el parámetro del procedimiento es un parámetro de salida:
1 = verdadero.
0 = falso.
isnullable int indica si la columna permite valores nulos:
1 = verdadero.
0 = falso.
COLUMN_DEFAULT valor predeterminado
PKey Clave primaria.
////////
Se utilizan las siguientes funciones:
--------------------------
CREAR FUNCIÓN dbo.fnIsColumnPrimaryKey(@sTableID int, @nColumnName varchar(128))
--alter FUNCTION dbo.fnIsColumnPrimaryKey(@sTableName varchar(128), @nColumnName varchar(128))
bit de devoluciones
COMO
COMENZAR
DECLARAR @nTableID int,
@nIndexID entero,
@yo entiendo
SET @nTableID = @sTableID--OBJECT_ID(@sTableName)
SELECCIONAR @nIndexID = identificador
DE índices del sistema
DONDE identificación = @nTableID
Y entre 1 y 254
Y (estado y 2048) = 2048
SI @nIndexID es nulo
VOLVER 0
SI @nColumnName EN
(SELECCIONAR sc.[nombre]
DESDE sysindexkeys sik
UNIÓN INTERNA syscolumns sc ON sik.id = sc.id Y sik.colid = sc.colid
DONDE sik.id = @nTableID
Y sik.indid = @nIndexID)
COMENZAR
VOLVER 1
VOLVER
0
FIN
--------------------------
A través de esta declaración SQL, puede conocer los atributos de las columnas de todas las tablas de la base de datos.
Al ejecutar esta instrucción SQL dos veces respectivamente, se pueden recuperar y comparar los atributos de las columnas en las dos bibliotecas.
-------------------------------------------------- ---------------
Para funciones y procedimientos almacenados, utilice las siguientes declaraciones SQL:
seleccione * de sysobjects donde escriba x ('P','TF','IF','FN') ordene por [Nombre]
Se pueden consultar todos los nombres de funciones y procedimientos almacenados. Los resultados de la consulta del bucle,
En cada bucle, el nombre de la función o del procedimiento almacenado se almacena en una cadena SpobjectName y luego se llama al procedimiento almacenado: sp_helptext es el siguiente:
exec sp_helptext '" +SpobjectName+"'
Devuelve una tabla que contiene el contenido de texto del procedimiento almacenado SpobjectName. Una fila de texto en el procedimiento almacenado corresponde a una fila en la tabla.
Ejecute todos los SP y funciones con exec sp_helptext para obtener los códigos de todos los procedimientos y funciones almacenados.
Simplemente coloque los resultados en una tabla y compare las similitudes y diferencias.
Referencia: Libros en línea de SQL Server
<Generación automatizada de procedimientos almacenados en base de datos>( http://www.vckbase.com/document/viewdoc/?id=1111 )
Ahora solo comparamos los atributos de las columnas de tablas y vistas, así como los procedimientos y funciones almacenados.
La relación de restricciones entre tablas de comparación no se implementa.
Se agregará más tarde.