SQL सर्वर संग्रहित प्रक्रिया संशोधन का इतिहास कैसे रखें


22

नोट: मैं पूर्ण संस्करण नियंत्रण के बारे में नहीं पूछ रहा हूं।

क्या SQL सर्वर पर संग्रहीत कार्यविधियों का इतिहास रखने के लिए स्वचालित रूप से कोई तरीका है।

Google डॉक्स स्वचालित रूप से दस्तावेज़ों के संस्करणों का इतिहास रखता है और विकिपीडिया स्वचालित रूप से लेखों के संस्करणों का इतिहास रखता है।

मैं संग्रहीत प्रक्रियाओं को अद्यतन करने वाले उपयोगकर्ताओं को संग्रहीत प्रक्रियाओं के भंडार को बनाए रखने के लिए भी नहीं करना चाहता। यह बहुत अधिक काम है और लोग ऐसा नहीं करेंगे।

उम्मीद है कि यह कुछ मैं SQL सर्वर में चालू कर सकता है ...

(और संग्रहीत प्रक्रियाओं से वास्तव में मेरा मतलब है कि फ़ंक्शन, ट्राइगर, आदि। प्रोग्रामैबिलिटी के तहत मूल रूप से सब कुछ।)

मैंने /programming/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions फर्स्ट कॉस पर पोस्ट किया है मुझे संदेह है कि इसे वहाँ और अधिक देखने को मिलेगा।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
पॉल व्हाइट GoFundMonica कहते

जवाबों:


31

जब मैं पूरी तरह से सहमत हूं कि स्रोत नियंत्रण ऐसा करने का सही तरीका है, तो मैं यह भी समझता हूं कि सभी वातावरण अनुशासित नहीं हैं कि अकेले उस पर भरोसा करें (यदि सभी पर), और कभी-कभी ऐप को रखने के लिए सीधे परिवर्तन करना पड़ता है। चल रहा है, एक ग्राहक को बचाने के लिए, आपके पास क्या है।

आप एक अलग डेटाबेस में तालिका में सभी संशोधनों को रखने के लिए (और अक्सर उस डेटाबेस का बैकअप ले सकते हैं) डीडीएल ट्रिगर का उपयोग कर सकते हैं। मान लें कि आपके पास एक उपयोगिता डेटाबेस है:

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 इसे करने का सबसे सरल और देशी तरीका। मेरा अनुमान है कि यह वह उत्तर है जो ओपी देख रहा था।
थॉमस स्ट्रिंगर

हां, यह ओपी की समस्या के समाधान के लिए जाना जाएगा।
मारी

मुझे यह उत्तर पसंद है क्योंकि एक बार जब आप ऐसा कर लेते हैं तो आपको बिना किसी अतिरिक्त लागत के स्वचालित संस्करण मिल जाता है। मैं मानता हूं कि यह स्रोत नियंत्रण के समान नहीं है, लेकिन यह एक मूल्यवान सुरक्षा जाल है जिसे नजरअंदाज नहीं किया जाना चाहिए।
डैनियल विलियम्स

2

मुझे नहीं लगता कि संस्करण नियंत्रण के तहत अपने SQL स्रोत कोड को स्वचालित रूप से रखने का कोई तरीका है। मेरा मतलब Native SQL Server टूल्स से है। मुझे लगता है कि आप git या svn का उपयोग करके समाप्त हो सकते हैं, लेकिन मेरे लिए सबसे अच्छा समाधान संस्करण नियंत्रण के तहत डेटाबेस (और संग्रहीत प्रक्रियाओं) को रखने के लिए रेड गेट के स्रोत नियंत्रण को खरीदना था ।


1
ज़रूर, डीडीएल ट्रिगर 3 पार्टी टूल की आवश्यकता के बिना ऐसा कर सकता है (मेरा उत्तर देखें)। बेशक स्रोत नियंत्रण बहुत अधिक नियंत्रण और ऑडिटिंग प्रदान करता है, और 3 पार्टी उपकरण में बहुत अधिक विशेषताएं होंगी जो आप खुद लिखना चाहते हैं, लेकिन आपके पास प्रत्यक्ष परिवर्तनों से बचाने का कोई तरीका नहीं है - दूसरे शब्दों में वे भरोसा करते हैं स्रोत नियंत्रण प्रोटोकॉल (जो हमेशा संभव नहीं है) का पालन करने वाले सभी पर।
हारून बर्ट्रेंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.