Làm cách nào để giữ lịch sử sửa đổi thủ tục lưu trữ của SQL Server


22

Lưu ý: Tôi không hỏi về kiểm soát phiên bản đầy đủ.

Có cách nào tự động để giữ một lịch sử các thủ tục được lưu trữ trên SQL Server.

Tương tự như cách Google Docs tự động lưu giữ lịch sử các phiên bản của tài liệu và Wikipedia sẽ tự động lưu lại lịch sử các phiên bản của bài viết.

Tôi không muốn người dùng cập nhật các thủ tục được lưu trữ cũng phải duy trì một kho lưu trữ các thủ tục được lưu trữ. Đây là quá nhiều công việc và mọi người sẽ không làm điều đó.

Hy vọng rằng đây là thứ tôi có thể bật trong SQL Server ...

(Và theo các thủ tục được lưu trữ thực sự tôi có nghĩa là các chức năng, trình kích hoạt, v.v. Về cơ bản mọi thứ đều có thể lập trình được.)

Tôi đã đăng lên /programming/14522224/how-to-keep-history-of-sql-server-stored-procedure-revutions trước tiên tôi nghi ngờ rằng nó sẽ nhận được nhiều lượt xem hơn ở đó.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White nói GoFundMonica

Câu trả lời:


31

Mặc dù tôi hoàn toàn đồng ý rằng kiểm soát nguồn là cách phù hợp để thực hiện việc này, tôi cũng hiểu rằng không phải tất cả các môi trường đều đủ kỷ luật để chỉ dựa vào điều đó (nếu có) và đôi khi phải thay đổi trực tiếp để giữ ứng dụng chạy, lưu một khách hàng, những gì có bạn.

Bạn có thể sử dụng trình kích hoạt DDL để giữ tất cả các sửa đổi trong một bảng trong một cơ sở dữ liệu riêng biệt (và tất nhiên là thường xuyên sao lưu cơ sở dữ liệu đó). Giả sử bạn có một cơ sở dữ liệu tiện ích:

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)
);

Bây giờ trong cơ sở dữ liệu của bạn, trước tiên hãy lấy cái mà chúng ta gọi là "kiểm soát ban đầu" - phiên bản hiện tại của các thủ tục được lưu trữ:

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;

Bây giờ để nắm bắt các thay đổi tiếp theo, hãy thêm trình kích hoạt DDL vào cơ sở dữ liệu:

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

Theo thời gian, nó sẽ trở nên dễ dàng để xem và so sánh các thay đổi với quy trình, xem các quy trình mới được thêm vào hệ thống, xem các quy trình bị loại bỏ và có ý tưởng tốt về việc ai sẽ nói chuyện với bất kỳ sự kiện nào trong số này.

Thêm thông tin ở đây:

http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/


2
+1 Cách đơn giản nhất và tự nhiên để làm điều đó. Tôi đoán đây là câu trả lời mà OP đang tìm kiếm.
Thomas Stringer

Đúng, đây sẽ là giải pháp cho vấn đề của OP.
Mary

Tôi thích câu trả lời này bởi vì một khi bạn làm điều đó thì bạn sẽ có được phiên bản tự động mà không mất thêm chi phí. Tôi đồng ý rằng nó không giống như Kiểm soát nguồn, nhưng đó là một mạng lưới an toàn có giá trị không nên bỏ qua.
Daniel Williams

2

Tôi không nghĩ rằng có bất kỳ cách nào để tự động giữ Mã nguồn SQL của bạn dưới sự kiểm soát phiên bản. Ý tôi là với các công cụ SQL Server gốc. Tôi nghĩ rằng bạn cuối cùng có thể sử dụng git hoặc svn, nhưng giải pháp tốt nhất cho tôi là mua Kiểm soát nguồn của Red Gate để giữ cơ sở dữ liệu (và các thủ tục được lưu trữ) dưới sự kiểm soát phiên bản.


1
Chắc chắn, một trình kích hoạt DDL có thể làm điều này mà không cần các công cụ của bên thứ 3 (xem câu trả lời của tôi). Tất nhiên, kiểm soát nguồn cung cấp kiểm soát và kiểm toán lớn hơn nhiều và các công cụ của bên thứ 3 sẽ có nhiều tính năng hơn bạn muốn tự viết, nhưng họ không có cách nào bảo vệ bạn khỏi những thay đổi trực tiếp - nói cách khác họ dựa vào trên tất cả mọi người tuân theo giao thức kiểm soát nguồn (không phải lúc nào cũng khả thi).
Aaron Bertrand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.