SQL Server’da Prosedür, Trigger, Fonksiyon ve View Üzerindeki Değişiklikleri İzlemek

Herkese merhaba,

Bu yazıda SQL Server’da Prosedür, Trigger, Fonksiyon ve View Üzerindeki değişiklikleri izlemek hakkında bilgi vereceğim.

Konunun çıkış noktası SQL Server Eğitimleri Telegram Grubunda soruyu bir arkadaşın sormasıdır.

Konu hakkında araştırma yaptım. Birkaç ufak örnek vardı. Bu örnekleri biraz daha kapsamlı halde kodlayıp paylaşmak istedim. Konu hakkında Türkçe bir yazı ya da makale mevcut değildir ya da varsa bana denk gelmedi. Alanında tektir. Daha da geliştirilebilir.

Bu işlemi hangi veritabanına uygulamak istiyorsanız o veritabanı üzerinde bu işlemleri yapın. Bu konu oldukça önemlidir.

Ben örnek olması açısından işlemlerimi Adventureworks adlı veritabanı üzerinden yaptım. İlk olarak aşağıdaki kodları ilgili veritabanınızda doğrudan çalıştırın.

Konu ile ilgili kodları aşağıda görmektesiniz.

--DDL Tablosu Oluşturma

CREATE TABLE DDLIzleyici
(
    EventDate    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    EventType    NVARCHAR(64),
    EventDDL     NVARCHAR(MAX),
    EventXML     XML,
    DatabaseName NVARCHAR(255),
    SchemaName   NVARCHAR(255),
    ObjectName   NVARCHAR(255),
    HostName     VARCHAR(64),
    IPAddress    VARCHAR(48),
    ProgramName  NVARCHAR(255),
    LoginName    NVARCHAR(255)
);


--Daha önce oluşturulmuş Prosedürleri DDL Tablosuna Ekleme

INSERT dbo.DDLIzleyici
(
    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;


--Daha önce oluşturulmuş Viewları DDL Tablosuna Ekleme

INSERT dbo.DDLIzleyici
(
    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.views;


--Daha önce oluşturulmuş Fonksiyonları DDL Tablosuna Ekleme

INSERT dbo.DDLIzleyici
(
    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.objects o WHERE o.type IN ('IF','TF','FN')


--Daha önce oluşturulmuş Triggerları DDL Tablosuna Ekleme


INSERT dbo.DDLIzleyici
(
    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.triggers;


--DDL Triggeri Oluşturulması

CREATE TRIGGER DDLTriggerKontrol
ON DATABASE
FOR CREATE_PROCEDURE, DROP_PROCEDURE, ALTER_PROCEDURE, CREATE_TRIGGER, DROP_TRIGGER, ALTER_TRIGGER, CREATE_FUNCTION, DROP_FUNCTION, ALTER_FUNCTION, CREATE_VIEW, DROP_VIEW, ALTER_VIEW
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @EventData XML = EVENTDATA();

    DECLARE @ip VARCHAR(48) = CONVERT(VARCHAR(48), CONNECTIONPROPERTY('client_net_address'));

    INSERT DDLIzleyici
    (
        EventType,
        EventDDL,
        EventXML,
        DatabaseName,
        SchemaName,
        ObjectName,
        HostName,
        IPAddress,
        ProgramName,
        LoginName
    )
    SELECT @EventData.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'),
           @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'),
           @EventData,
           DB_NAME(),
           @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]', 'NVARCHAR(255)'),
           @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)'),
           HOST_NAME(),
           @ip,
           PROGRAM_NAME(),
           SUSER_SNAME();
END;
GO

Yukarıda yapılan işlemi kısaca açıklayalım. Daha önceden bu veritabanı üzerinde oluşturmuş olduğunuz prosedür, trigger, fonksiyon ve viewları yedeklemektedir. DDLIzleyici tablosuna create edilmiş hallerini atmaktadır.

Kodu çalıştırdıktan sonra DDLIzleyici tablosuna select ile baktığınızda aşağıdaki gibi bir sonuç göreceksiniz.

SQL Server’da Prosedür, Trigger, Fonksiyon ve View Üzerindeki Değişiklikleri İzlemek

Görüldüğü üzere prosedür, trigger, fonksiyon ve viewlar yedeklendi.

Şidmi dilerseniz bir fonksiyon oluşturalım ve sonrasında tablomuza bakalım. Oluşturulan fonksiyon ile ilgili bilgi DDLIzleyici tablosunda olacak mı inceleyelim. Örnek kodu aşağıdan kopyalayıp ilgili veritabanınızda çalıştırın.

CREATE FUNCTION denemeler
()
RETURNS VARCHAR(20)
AS
BEGIN
RETURN 'selamlar';
END;

Kodu çalıştırdıktan sonra DDLIzleyici tablosunu select ile kontrol edin.

SQL Server’da Prosedür, Trigger, Fonksiyon ve View Üzerindeki Değişiklikleri İzlemek

Görüldüğü üzere oluşturulmuş olan fonksiyon ile ilgili bilgi DDLIzleyici tablosunda tutulmuş oldu. Fonksiyonun içeriği, kimin oluşturduğu, hostname bilgisi, oluşturmada kullanılan program adı ve hangi yetkilinin bu fonkisyonu oluşturduğunu görmektesiniz. Değiştirme yani ALTER ile Silme yani DROP işlemlerinde de benzer şekilde sonuçları tabloya basacaktır.

Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.

493 Kez Okundu

Yavuz Selim Kart

Yazılım ve veri tabanında bildiklerimi anlatmaya gayret ediyorum. Halen birçok programlama dili üzerinde araştırmalar yaparak kendimi geliştiriyorum. Bunlar haricinde Grafik Tasarım ve Wordpress konularına da ilgim bulunmakta. SEO ve Sosyal medya yönetimleri hakkında da bilgim mevcuttur. Kısaca çok çalışmayı seven azimli biriyim.

You may also like...

Yazı kopyalamak yasaktır!