Gestern war ich frustriert über die mangelnde Synchronisierung der Datenbank. Die für die Entwicklung und das Testen verwendeten Bibliotheken sind nicht identisch. In der entwickelten Bibliothek werden die gespeicherten Prozeduren häufig aktualisiert. Manchmal ändert sich sogar die Tabellenstruktur.
Dies führt zu vielen Problemen. Eine Zeit lang wusste ich nicht, was das konkrete Problem war, was mich sehr in Verlegenheit brachte. Ich wollte plötzlich ein Programm schreiben, um die Unterschiede zwischen den beiden Bibliotheken zu vergleichen und das Testen und Implementieren zu erleichtern.
Heute Morgen habe ich während einer Besprechung geschrieben und mittags den Test bestanden,
hauptsächlich zwei SQL-Anweisungen:
Das SQL mit unterschiedlichen Tabellen- und Ansichtsstrukturen und Spaltenattributen in der Abfragebibliothek lautet wie folgt:
Wählen Sie A. [Name] als Tabellennamen aus,
B. [Name] als Kolname,
B.xtype,
B.xusertype,
B.Länge,
B.colid,
B.cdefault,
B.domain,
B.Nummer,
B.Offset,
B.status,
B.Typ,
B.Benutzertyp,
B.prec,
B.Skala,
B. wird berechnet,
B.isoutparam,
B.isnullbar,
C.COLUMN_DEFAULT,
dbo.fnIsColumnPrimaryKey(B. [ID], B. [Name]) als PKey
aus Sysobjects A, Syscolumns B, INFORMATION_SCHEMA .COLUMNS C
wobei a.id = B.id
und A.xtype in ('u', 'v')
und A. Name = C.TABLE_NAME
und B. Name = C.COLUMN_NAME
Reihenfolge nach A. [ID], B. [Name]
///////
Die Bedeutung jeder Spalte ist wie folgt
name sysname Spaltenname oder Name eines Prozedurparameters.
id int Die Tabellenobjekt-ID, zu der diese Spalte gehört, oder die diesem Parameter zugeordnete gespeicherte Prozedur-ID.
xtype tinyint Physischer Speichertyp in Systypes.
typestat tinyint Nur zur internen Verwendung.
xusertype smallint Erweiterte benutzerdefinierte Datentyp-ID.
length smallint Maximale physische Speicherlänge in Systemtypen.
xprec tinyint Nur zur internen Verwendung.
xscale tinyint Nur zur internen Verwendung.
colid smallint Spalte oder Parameter-ID.
xoffset smallint Nur zur internen Verwendung.
bitpos tinyint Nur zur internen Verwendung.
reserviert tinyint Nur zur internen Verwendung.
colstat smallint Nur zur internen Verwendung.
cdefault int Die Standardwert-ID dieser Spalte.
domain int Die Regel- oder CHECK-Einschränkungs-ID dieser Spalte.
number smallint Die Unterprozessnummer, wenn der Prozess gruppiert ist (0 gibt Nicht-Prozesselemente an).
colorder smallint Nur zur internen Verwendung.
autoval varbinary(255) Nur zur internen Verwendung.
offset smallint Der Offset der Zeile, in der sich diese Spalte befindet; wenn er negativ ist, gibt er eine Zeile mit variabler Länge an.
Status tinyint Bitmap, die Spalten- oder Parameterattribute beschreibt:
0x08 = Spalte erlaubt Nullwerte.
0x10 = ANSI-Padding ist wirksam, wenn eine Varchar- oder Varbinary-Spalte hinzugefügt wird. Behält nachgestellte Leerzeichen für Varchar-Spalten und nachgestellte Nullen für Varbinary-Spalten bei.
0x40 = Der Parameter ist ein OUTPUT-Parameter.
0x80 = Spalte ist eine Identitätsspalte.
Typ tinyint Der physische Speichertyp in Systypes.
usertype smallint Benutzerdefinierte Datentyp-ID in Systypes.
printfmt varchar(255) Nur zur internen Verwendung.
prec smallint Der Präzisionsgrad dieser Spalte.
scale int Anzahl der Dezimalstellen für diese Spalte.
iscomputed int Flag, das angibt, ob die Spalte berechnet wurde:
0 = nicht berechnet.
1 = Berechnet.
isoutparam int gibt an, ob der Prozedurparameter ein Ausgabeparameter ist:
1 = wahr.
0 = falsch.
isnullable int gibt an, ob die Spalte Nullwerte zulässt:
1 = wahr.
0 = falsch.
COLUMN_DEFAULT Standardwert
PKey Primärschlüssel.
////////
Folgende Funktionen kommen zum Einsatz:
--------------------------
FUNKTION ERSTELLEN dbo.fnIsColumnPrimaryKey(@sTableID int, @nColumnName varchar(128))
--alter FUNCTION dbo.fnIsColumnPrimaryKey(@sTableName varchar(128), @nColumnName varchar(128))
RETURNS-Bit
ALS
BEGINNEN
DECLARE @nTableID int,
@nIndexID int,
@i int
SET @nTableID = @sTableID--OBJECT_ID(@sTableName)
SELECT @nIndexID = indid
VON sysindexes
WHERE id = @nTableID
UND indid ZWISCHEN 1 UND 254
UND (Status & 2048) = 2048
WENN @nIndexID Null ist
RÜCKKEHR 0
IF @nColumnName IN
(SELECT sc.[Name]
VON sysindexkeys sik
INNER JOIN syscolumns sc ON sik.id = sc.id UND sik.colid = sc.colid
WHERE sik.id = @nTableID
UND sik.indid = @nIndexID)
BEGINNEN
RÜCKKEHR 1
ENDE
ZURÜCK 0
ENDE
--------------------------
Mit dieser SQL-Anweisung können Sie die Spaltenattribute aller Tabellen in der Datenbank ermitteln.
Durch jeweils zweimalige Ausführung dieser SQL-Anweisung können die Attribute der Spalten in den beiden Bibliotheken abgerufen und verglichen werden.
-------------------------------------------------- ---------------
Verwenden Sie für gespeicherte Prozeduren und Funktionen die folgenden SQL-Anweisungen:
Wählen Sie * aus Sysobjects aus, wobei xtype in ('P','TF','IF','FN') Reihenfolge nach [Name] eingibt.
Alle gespeicherten Prozedur- und Funktionsnamen können abgefragt werden. Die Ergebnisse der Schleifenabfrage,
In jeder Schleife wird der Name der Funktion oder der gespeicherten Prozedur in einer Zeichenfolge SpobjectName gespeichert und dann wird die gespeicherte Prozedur aufgerufen: sp_helptext lautet wie folgt:
exec sp_helptext '" +SpobjectName+"'
Gibt eine Tabelle zurück, die den Textinhalt in der gespeicherten Prozedur SpobjectName enthält. Eine Textzeile in der gespeicherten Prozedur entspricht einer Zeile in der Tabelle.
Führen Sie alle SPs und Funktionen mit exec sp_helptext aus, um die Codes aller gespeicherten Prozeduren und Funktionen abzurufen.
Tragen Sie die Ergebnisse einfach in eine Tabelle ein und vergleichen Sie die Gemeinsamkeiten und Unterschiede.
Referenz: SQL Server-Onlinedokumentation
<Automatisierte Generierung gespeicherter Prozeduren in der Datenbank>( http://www.vckbase.com/document/viewdoc/?id=1111 )
Jetzt vergleichen wir nur noch Spaltenattribute von Tabellen und Ansichten sowie gespeicherte Prozeduren und Funktionen.
Die Einschränkungsbeziehung zwischen Vergleichstabellen ist nicht implementiert.
Wird später hinzugefügt.