Poznámka: Neptám se na úplnou kontrolu verze.
Existuje nějaký způsob, jak automaticky uchovávat historii uložených procedur na serveru SQL.
Podobně jako Google Docs automaticky udržuje historii verzí dokumentů a Wikipedia automaticky udržuje historii verzí článků.
Nechci, aby uživatelé aktualizující uložené procedury měli také udržovat úložiště uložených procedur. To je příliš mnoho práce a lidé to neudělají.
Doufejme, že to je něco, co mohu zapnout v SQL Server ...
(A podle uložených procedur mám na mysli funkce, spouštěče atd. V podstatě všechno v rámci Programovatelnosti.)
Zveřejnil jsem příspěvek https://stackoverflow.com/questions/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions první, protože mám podezření, že získá více zobrazení tam.
I když plně souhlasím s tím, že ovládání zdroje je tím správným způsobem, chápu také, že ne všechna prostředí jsou dostatečně disciplinovaná, aby se na to mohla spoléhat sama (pokud vůbec), a že někdy je třeba provést změny přímo, aby aplikace zůstala běh, uložte klienta, co máte.
Spouštěč DDL můžete použít k uchování všech revizí v tabulce v samostatné databázi (a samozřejmě tuto databázi samozřejmě často zálohovat). Předpokládejme, že máte databázi nástrojů:
USE Utility;
GO
CREATE TABLE dbo.ProcedureChanges
(
EventDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
EventType NVARCHAR(100),
EventDDL NVARCHAR(MAX),
DatabaseName NVARCHAR(255),
SchemaName NVARCHAR(255),
ObjectName NVARCHAR(255),
HostName NVARCHAR(255),
IPAddress VARCHAR(32),
ProgramName NVARCHAR(255),
LoginName NVARCHAR(255)
);
Nyní ve vaší databázi nejprve pojďme chytit to, čemu říkáme „počáteční kontrola“ - aktuální verze uložených procedur:
USE YourDB;
GO
INSERT Utility.dbo.ProcedureChanges
(
EventType,
EventDDL,
DatabaseName,
SchemaName,
ObjectName
)
SELECT
N'Initial control',
OBJECT_DEFINITION([object_id]),
DB_NAME(),
OBJECT_SCHEMA_NAME([object_id]),
OBJECT_NAME([object_id])
FROM
sys.procedures;
Nyní, abyste zachytili následné změny, přidejte do databáze spouštěč DDL:
USE YourDB;
GO
CREATE TRIGGER CaptureStoredProcedureChanges
ON DATABASE
FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @EventData XML = EVENTDATA(), @ip VARCHAR(32);
SELECT @ip = client_net_address
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;
INSERT Utility.dbo.ProcedureChanges
(
EventType,
EventDDL,
SchemaName,
ObjectName,
DatabaseName,
HostName,
IPAddress,
ProgramName,
LoginName
)
SELECT
@EventData.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'),
@EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'),
@EventData.value('(/EVENT_INSTANCE/SchemaName)[1]', 'NVARCHAR(255)'),
@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)'),
DB_NAME(), Host_NAME(), @ip, PROGRAM_NAME(), SUSER_SNAME();
END
GO
Postupem času bude snadné vidět a porovnat změny v postupech, sledovat, jak se do systému přidávají nové postupy, vidět, jak vypadají procedury, a mít dobrou představu o tom, s kým o jakékoli z těchto událostí hovořit.
Více informací zde:
http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/
Nemyslím si, že existuje nějaký způsob, jak automaticky udržet zdrojový kód SQL pod kontrolou verzí. Mám na mysli nástroje Native SQL Server. Myslím, že byste mohli nakonec použít git nebo svn, ale nejlepší řešení pro mě bylo koupit Red Gate's Source Control za udržování databází (a uložených procedur) pod kontrolou verzí.