Ontem fiquei frustrado com a falta de sincronização do banco de dados. As bibliotecas utilizadas para desenvolvimento e teste não são as mesmas. Na biblioteca desenvolvida, os procedimentos armazenados são atualizados com frequência. Às vezes até a estrutura da tabela muda.
Isso leva a muitos problemas. Por um tempo, eu não sabia qual era o problema específico, o que me deixou muito envergonhado. De repente, tive vontade de escrever um programa para comparar as diferenças entre as duas bibliotecas para facilitar o teste e a implementação.
Esta manhã, eu estava escrevendo durante uma reunião e passei no teste ao meio-dia.
Principalmente em duas instruções SQL:
O SQL com diferentes estruturas de tabela e visualização e atributos de coluna na biblioteca de consulta é o seguinte:
selecione A. [nome] como TableName,
B. [nome] como Colname,
Tipo B.x,
B.xusertype,
B. comprimento,
B.colid,
B.cdefault,
B.domínio,
B. número,
B. deslocamento,
B. status,
B.tipo,
B. tipo de usuário,
B.prec,
B. escala,
B. computado,
B.isoutparam,
B. é anulável,
C.COLUMN_DEFAULT,
dbo.fnIsColumnPrimaryKey(B. [ID], B. [nome]) como PKey
de sysobjects A, syscolumns B, INFORMATION_SCHEMA .COLUMNS C
onde a.id = B.id
e A.xtype em ('u', 'v')
e A. Nome = C.TABLE_NAME
e B. Nome = C.COLUMN_NAME
ordenar por A. [ID], B. [Nome]
///////
O significado de cada coluna é o seguinte
name sysname Nome da coluna ou nome de um parâmetro de procedimento.
id int O ID do objeto da tabela ao qual esta coluna pertence ou o ID do procedimento armazenado associado a este parâmetro.
xtype tinyint Tipo de armazenamento físico em systypes.
typestat tinyint Somente para uso interno.
xusertype smallint ID de tipo de dados estendido definido pelo usuário.
length smallint Comprimento máximo do armazenamento físico em systypes.
xprec tinyint Somente para uso interno.
xscale tinyint Somente para uso interno.
coluna colid smallint ou ID do parâmetro.
xoffset smallint Somente para uso interno.
bitpos tinyint Somente para uso interno.
reservado tinyint Apenas para uso interno.
colstat smallint Somente para uso interno.
cdefault int O ID do valor padrão desta coluna.
domain int A regra ou ID de restrição CHECK desta coluna.
número smallint O número do subprocesso quando o processo é agrupado (0 indica itens que não são do processo).
colorder smallint Somente para uso interno.
autoval varbinary(255) Somente para uso interno.
offset smallint O deslocamento da linha na qual esta coluna está localizada, se negativo, indica uma linha de comprimento variável.
status tinyint Bitmap que descreve atributos de coluna ou parâmetro:
0x08 = A coluna permite valores nulos.
0x10 = O preenchimento ANSI está em vigor ao adicionar uma coluna varchar ou varbinary. Preserva espaços à direita para colunas varchar e zeros à direita para colunas varbinary.
0x40 = O parâmetro é um parâmetro OUTPUT.
0x80 = A coluna é uma coluna de identidade.
type tinyint O tipo de armazenamento físico em systypes.
usertype smallint ID do tipo de dados definido pelo usuário em systypes.
printfmt varchar(255) Somente para uso interno.
prec smallint O nível de precisão desta coluna.
scale int Número de casas decimais para esta coluna.
iscomputed int Sinalizador que indica se a coluna foi calculada:
0 = não calculado.
1 = Calculado.
isoutparam int indica se o parâmetro do procedimento é um parâmetro de saída:
1 = verdadeiro.
0 = falso.
isnullable int indica se a coluna permite valores nulos:
1 = verdadeiro.
0 = falso.
Valor padrão COLUMN_DEFAULT
PKey Chave primária.
////////
As seguintes funções são usadas:
--------------------------
CRIAR FUNÇÃO dbo.fnIsColumnPrimaryKey(@sTableID int, @nColumnName varchar(128))
--alter FUNÇÃO dbo.fnIsColumnPrimaryKey(@sTableName varchar(128), @nColumnName varchar(128))
bit RETORNA
COMO
COMEÇAR
DECLARE @nTableID int,
@nIndexIDint,
@eu int
SET @nTableID = @sTableID--OBJECT_ID(@sTableName)
SELECT @nIndexID = indid
DE índices de sistema
ONDE id = @nTableID
E indicou ENTRE 1 E 254
E (status e 2048) = 2048
SE @nIndexID for nulo
RETORNAR 0
SE @nColumnName IN
(SELECIONE sc.[nome]
DE sysindexkeys sik
INNER JOIN syscolumns sc ON sik.id = sc.id AND sik.colid = sc.colid
ONDE sik.id = @nTableID
E sik.indid = @nIndexID)
COMEÇAR
RETORNO 1
FIM RETORNO
0
FIM
--------------------------
Através desta instrução SQL, você pode descobrir os atributos das colunas de todas as tabelas do banco de dados.
Ao executar esta instrução SQL duas vezes respectivamente, os atributos das colunas nas duas bibliotecas podem ser recuperados e comparados.
-------------------------------------------------- ---------------
Para procedimentos e funções armazenados, use as seguintes instruções SQL:
selecione * em sysobjects onde xtype ('P','TF','IF','FN') ordene por [Nome]
Todos os nomes de procedimentos armazenados e funções podem ser consultados. Os resultados da consulta de loop,
Em cada loop, o nome da função ou procedimento armazenado é armazenado em uma string SpobjectName e, em seguida, o procedimento armazenado é chamado: sp_helptext é o seguinte:
exec sp_helptext '" +SpobjectName+"'
Retorna uma tabela que contém o conteúdo de texto no procedimento armazenado SpobjectName. Uma linha de texto no procedimento armazenado corresponde a uma linha na tabela.
Execute todos os SPs e funções com exec sp_helptext para obter os códigos de todos os procedimentos e funções armazenados.
Basta colocar os resultados em uma tabela e comparar as semelhanças e diferenças.
Referência: Manuais Online do SQL Server
<Geração automatizada de procedimentos armazenados em banco de dados>( http://www.vckbase.com/document/viewdoc/?id=1111 )
Agora comparamos apenas atributos de colunas de tabelas e visualizações, bem como procedimentos e funções armazenados.
A relação de restrição entre tabelas de comparação não é implementada.
Será adicionado mais tarde.