วิธีเก็บประวัติของ SQL Server ที่จัดเก็บการแก้ไขขั้นตอน


22

หมายเหตุ: ฉันไม่ได้ถามเกี่ยวกับการควบคุมเวอร์ชันเต็ม

มีวิธีใดโดยอัตโนมัติในการเก็บประวัติของกระบวนงานที่เก็บไว้ใน SQL Server

คล้ายกับวิธีที่ Google เอกสารเก็บประวัติเวอร์ชันของเอกสารโดยอัตโนมัติและ Wikipedia เก็บประวัติเวอร์ชันของบทความโดยอัตโนมัติ

ฉันไม่ต้องการให้ผู้ใช้อัปเดตกระบวนงานที่เก็บไว้เพื่อรักษาพื้นที่เก็บข้อมูลของขั้นตอนการจัดเก็บไว้ด้วย นี่เป็นงานมากเกินไปและผู้คนจะไม่ทำ

หวังว่านี่คือสิ่งที่ฉันสามารถเปิดใน SQL Server ...

(และโดยขั้นตอนการจัดเก็บจริงๆฉันหมายถึงฟังก์ชั่นทริกเกอร์ ฯลฯ โดยทั่วไปทุกอย่างภายใต้ความสามารถในการโปรแกรม)

ฉันโพสต์ไปที่/programming/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisionsก่อนเพราะฉันสงสัยว่ามันจะได้รับมุมมองเพิ่มเติมที่นั่น


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
พอลไวท์พูดว่า GoFundMonica

คำตอบ:


31

ในขณะที่ฉันเห็นด้วยอย่างเต็มที่ว่าการควบคุมแหล่งที่มาเป็นวิธีที่ถูกต้องในการทำสิ่งนี้ฉันยังเข้าใจด้วยว่าสภาพแวดล้อมบางอย่างนั้นไม่ได้รับการลงโทษทางวินัยมากพอที่จะไว้ใจคนเดียว (ถ้าทั้งหมด) และบางครั้งการเปลี่ยนแปลง วิ่งบันทึกลูกค้าคุณมีอะไรบ้าง

คุณสามารถใช้ทริกเกอร์ 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/


2
+1 วิธีที่ง่ายที่สุดและดั้งเดิมในการทำ ฉันเดาว่านี่คือคำตอบที่ OP มองหา
Thomas Stringer

ใช่นี่จะเป็นทางออกสำหรับปัญหาของ OP
Marian

ฉันชอบคำตอบนี้เพราะเมื่อคุณทำแล้วคุณจะได้รับเวอร์ชันอัตโนมัติโดยไม่มีค่าใช้จ่ายเพิ่มเติม ฉันยอมรับว่ามันไม่เหมือนกับ Source Control แต่เป็นเครือข่ายความปลอดภัยที่มีค่าที่ไม่ควรมองข้าม
Daniel Williams

2

ฉันไม่คิดว่าจะมีวิธีใดที่จะรักษาซอร์สโค้ด SQL ของคุณโดยอัตโนมัติภายใต้การควบคุมเวอร์ชัน ฉันหมายถึงด้วยเครื่องมือ Native SQL Server ฉันคิดว่าคุณสามารถใช้ git หรือ svn ได้ แต่ทางออกที่ดีที่สุดสำหรับฉันคือซื้อSource Control ของ Red Gateเพื่อรักษาฐานข้อมูล (และขั้นตอนการจัดเก็บ) ภายใต้การควบคุมเวอร์ชัน


1
แน่นอนว่าตัวเรียก DDL สามารถทำได้โดยไม่ต้องใช้เครื่องมือของบุคคลที่สาม (ดูคำตอบของฉัน) แน่นอนว่าการควบคุมแหล่งที่มานั้นมีการควบคุมและตรวจสอบที่ดีกว่ามากและเครื่องมือของบุคคลที่สามจะมีคุณสมบัติมากมายกว่าที่คุณต้องการจะเขียนด้วยตัวเอง แต่พวกเขาไม่มีวิธีที่จะปกป้องคุณจากการเปลี่ยนแปลงโดยตรง - กล่าวอีกนัยหนึ่ง ในทุกคนที่เชื่อฟังโปรโตคอลควบคุมแหล่งที่มา (ซึ่งไม่เป็นไปได้เสมอ)
Aaron Bertrand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.