SQL Server saklı yordam düzeltmeleri geçmişini tutmak nasıl


22

Not: Tam sürüm kontrolü hakkında soru sormuyorum.

SQL Server'da saklı yordamların geçmişini tutmak için otomatik olarak herhangi bir yolu var mı.

Google Dokümanlar’ın dokümanların sürümlerini otomatik olarak kaydetme biçimine benzer şekilde ve Wikipedia da makale sürümlerinin geçmişini otomatik olarak tutar.

Saklı yordamları güncelleştiren kullanıcıların saklı yordamlar havuzunu da korumasını istemiyorum. Bu çok fazla iş ve insanlar bunu yapmayacak.

Umarım bu, SQL Server'da açabileceğim bir şeydir ...

(Ve saklı yordamlar ile gerçekten kastediyorum, fonksiyonlar, tetikleyiciler, vs.

Https://stackoverflow.com/questions/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions adresine gönderdim ilk önce orada daha fazla görüş alacağından şüpheleniyorum.


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Paul White GoFundMonica

Yanıtlar:


31

Kaynak kontrolünün bunu yapmanın doğru yolu olduğu konusunda hemfikir olduğum halde, tüm ortamların tek başına buna dayanacak kadar disipline edilmediğini (eğer varsa) ve bazen de uygulamanın sürdürülmesi için doğrudan yapılması gerekenlerin olduğunu da anlıyorum. Koşturup, bir müşteriyi kurtar.

Bir tablodaki tüm revizyonları ayrı bir veritabanında tutmak için bir DDL tetikleyicisi kullanabilirsiniz (ve tabii ki bu veritabanını sık sık yedekleyin). Bir yardımcı program veritabanınız olduğunu varsayalım:

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

Şimdi veritabanınızda, öncelikle "ilk kontrol" dediğimiz şeyi alalım - saklı yordamların şu anki sürümü:

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;

Şimdi müteakip değişiklikleri yakalamak için veritabanına bir DDL tetikleyicisi ekleyin:

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

Zamanla prosedürlerdeki değişiklikleri görmek ve karşılaştırmak, sisteme yeni prosedürlerin eklenmesini izlemek, prosedürlerin düştüğünü görmek ve bu olayların herhangi biri hakkında kiminle konuşacağına dair iyi bir fikre sahip olmak kolaylaşacaktır.

Daha fazla bilgi burada:

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


2
+1 Bunu yapmanın en basit ve yerel yolu. Tahminime göre, bu OP'nin aradığı cevap.
Thomas Stringer

Evet, bu OP'nin probleminin çözümü olacaktır.
Marian

Bu cevabı seviyorum, çünkü bir kez yaparsanız ek bir ücret ödemeden otomatik versiyonlama yapabilirsiniz. Kaynak Kontrol ile aynı olmadığını kabul ediyorum, ancak göz ardı edilmemesi gereken değerli bir güvenlik ağı.
Daniel Williams,

2

SQL Kaynak Kodunuzu otomatik olarak sürüm kontrolü altında tutmanın bir yolu olduğunu sanmıyorum. Yerli SQL Server araçları ile demek istiyorum. Git veya svn kullanarak son bulabileceğinizi düşünüyorum, ancak benim için en iyi çözüm veritabanlarını (ve saklı yordamları) sürüm kontrolü altında tutmak için Red Gate'in Kaynak Kontrolü'nü satın almaktı .


1
Elbette, bir DDL tetikleyicisi 3. parti araçlara ihtiyaç duymadan bunu yapabilir (cevabımı görün). Elbette kaynak kontrolü çok daha fazla kontrol ve denetim sunar ve 3. parti araçların kendiniz yazmak isteyeceğinizden çok daha fazla özelliği olacaktır, ancak sizi doğrudan değişikliklerden koruyacak bir yolu yoktur - başka bir deyişle, güveniyorlar Kaynak kontrol protokolüne uymak herkes için (bu her zaman mümkün değildir).
Aaron Bertrand
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.