Um den Dump in ein Quellcode-Verwaltungssystem zu beschleunigen, können Sie sehen, welche Objekte sich seit dem letzten Mal geändert haben, indem Sie die Versionsinformationen in sysobjects verwenden.
Setup: Erstellen Sie eine Tabelle in jeder Datenbank, die Sie inkrementell überprüfen möchten, um die Versionsinformationen vom letzten Mal zu speichern (beim ersten Durchlauf leer). Löschen Sie diese Tabelle, wenn Sie Ihre gesamte Datenstruktur erneut scannen möchten.
IF ISNULL(OBJECT_ID('last_run_sysversions'), 0) <> 0 DROP TABLE last_run_sysversions
CREATE TABLE last_run_sysversions (
name varchar(128),
id int, base_schema_ver int,
schema_ver int,
type char(2)
)
Normaler Betriebsmodus: Sie können die Ergebnisse dieses SQL-Statements nehmen, SQL-Skripte nur für die Objekte erstellen, die Sie interessieren, und sie in einem Quellcode-Verwaltungssystem Ihrer Wahl ablegen.
IF ISNULL(OBJECT_ID('tempdb.dbo.#tmp'), 0) <> 0 DROP TABLE #tmp
CREATE TABLE #tmp (
name varchar(128),
id int, base_schema_ver int,
schema_ver int,
type char(2)
)
SET NOCOUNT ON
-- Fügen Sie die Werte vom Ende des letzten Durchlaufs in #tmp ein
INSERT #tmp (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM last_run_sysversions
DELETE last_run_sysversions
INSERT last_run_sysversions (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM sysobjects
-- Dieser nächste Abschnitt listet alle Unterschiede in den Skripten auf.
SET NOCOUNT OFF
--Umbenannt.
SELECT 'umbenannt' AS ChangeType, t.name, o.name AS extra_info, 1 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE o.name <> t.name /*COLLATE*/
AND o.type IN ('TR', 'P' ,'U' ,'V')
UNION
--Geändert (mit ALTER)
SELECT 'geändert' AS ChangeType, o.name /*COLLATE*/,
'geändert' AS extra_info, 2 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE (
o.base_schema_ver <> t.base_schema_ver
OR o.schema_ver <> t.schema_ver
)
AND o.type IN ('TR', 'P' ,'U' ,'V')
AND o.name NOT IN ( SELECT oi.name
FROM sysobjects oi INNER JOIN #tmp ti ON oi.id = ti.id
WHERE oi.name <> ti.name /*COLLATE*/
AND oi.type IN ('TR', 'P' ,'U' ,'V'))
UNION
--Geändert (tatsächlich gelöscht und neu erstellt [aber nicht umbenannt])
SELECT 'geändert' AS ChangeType, t.name, 'gelöscht' AS extra_info, 2 AS Priority
FROM #tmp t
WHERE t.name IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
WHERE NOT EXISTS (SELECT * FROM sysobjects oi
WHERE oi.id = ti.id))
AND t.name IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
WHERE NOT EXISTS (SELECT * FROM #tmp ti
WHERE oi.id = ti.id)
AND oi.type IN ('TR', 'P' ,'U' ,'V'))
UNION
--Gelöscht
SELECT 'gelöscht' AS ChangeType, t.name, '' AS extra_info, 0 AS Priority
FROM #tmp t
WHERE NOT EXISTS (SELECT * FROM sysobjects o
WHERE o.id = t.id)
AND t.name NOT IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
WHERE NOT EXISTS (SELECT * FROM #tmp ti
WHERE oi.id = ti.id)
AND oi.type IN ('TR', 'P' ,'U' ,'V'))
UNION
--Hinzugefügt
SELECT 'hinzugefügt' AS ChangeType, o.name /*COLLATE*/, '' AS extra_info, 4 AS Priority
FROM sysobjects o
WHERE NOT EXISTS (SELECT * FROM #tmp t
WHERE o.id = t.id)
AND o.type IN ('TR', 'P' ,'U' ,'V')
AND o.name NOT IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
WHERE NOT EXISTS (SELECT * FROM sysobjects oi
WHERE oi.id = ti.id))
ORDER BY Priority ASC
Hinweis: Wenn Sie eine nicht standardmäßige Kollation in einer Ihrer Datenbanken verwenden, müssen Sie /* COLLATE */
durch Ihre Datenbankkollation ersetzen. z.B. COLLATE Latin1_General_CI_AI