注:完全なバージョン管理については質問していません。
SQL Serverのストアドプロシージャの履歴を自動的に保持する方法はありますか?.
Googleドキュメントがドキュメントのバージョンの履歴を自動的に保持し、Wikipediaが記事のバージョンの履歴を自動的に保持する方法と同様です。
ストアドプロシージャを更新するユーザーにも、ストアドプロシージャのリポジトリを維持する必要はありません。これは大変な作業であり、人々はそれをしません。
うまくいけば、これはSQL Serverでオンにできるものです...
(そして、ストアドプロシージャとは、実際には関数、トリガーなどを意味します。基本的には、プログラマビリティの下のすべてのものです。)
私は https://stackoverflow.com/questions/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions 最初のcosに投稿しました。そこ。
私はソース管理がこれを行う正しい方法であることについて完全に同意していますが、すべての環境が(もしあれば)それだけに依存するのに十分な規律があるわけではなく、アプリを維持するために変更を直接行う必要があることも理解しています実行して、クライアントを保存します。
DDLトリガーを使用して、すべてのリビジョンを別のデータベースのテーブルに保持できます(もちろん、そのデータベースを頻繁にバックアップします)。ユーティリティデータベースがあると仮定します。
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)
);
次に、データベースで、最初に「初期制御」と呼ばれるもの(現在のバージョンのストアドプロシージャ)を取得します。
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;
次に、後続の変更を取り込むために、データベースに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
時間が経つにつれ、手順の変更を確認および比較しやすくなり、新しい手順がシステムに追加されるのを監視し、手順が削除されるのを確認し、これらのイベントについて誰と話をするべきかについて良い考えを持ちます。
詳細はこちら:
http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/
私は、SQLソースコードを自動的にバージョン管理する方法はないと思います。つまり、ネイティブSQL Serverツールについてです。最終的にはgitまたはsvnを使用できると思いますが、データベース(およびストアドプロシージャ)をバージョン管理下に置くために Red Gateのソース管理 を購入するのが最善の方法でした。