SQL Server ile ilgili her şey.

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

S

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.

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.

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.

SQL Server Eğitimleri Kanalına Abone Olun

Yazar Hakkında

Yavuz Selim Kart

SQL Server tarafında kendini ilerletmeye çalışırken bildiklerini sürekli başkalarına aktaran, yazılım dünyasında (C#, Java, Python vb.) kendini güncel tutmaya çalışan, araştırma yapmaktan bıkmayan, meraklı, bilginin üzerine bilgi katmaktan mutluluk duyan bir yazılım eğitmeni ve kod sever.
Grafik tasarım dünyasında Indesign'ı anlatacak kadar iyi kullanabilen, Photoshop ve Illustrator'e de orta düzey hakimiyeti bulunan, internet üzerinde online kimya dergisi kurmuş ve bunu yüzbinlerce kişiye ulaştırmayı başaran bir grafik sever.
WordPress tarafında 5 adet web sitesi kurmuş, bu sistemler üzerine çalışan bir WordPress sever.
Sosyal medya üzerinde okumalara ve araştırmalara devam eden, kendi kurmuş olduğu kimya dergisini daha çok kişiye nasıl ulaştırırım diye düşünen ve bu konuda SEO çalışmaları üzerine kafa yoran bir Sosyal Medya sever.
Kısaca çok çalışmayı seven, azimli biriyim.

Yavuz Selim Kart
SQL Server ile ilgili her şey.

Yazar

Yavuz Selim Kart

SQL Server tarafında kendini ilerletmeye çalışırken bildiklerini sürekli başkalarına aktaran, yazılım dünyasında (C#, Java, Python vb.) kendini güncel tutmaya çalışan, araştırma yapmaktan bıkmayan, meraklı, bilginin üzerine bilgi katmaktan mutluluk duyan bir yazılım eğitmeni ve kod sever.
Grafik tasarım dünyasında Indesign'ı anlatacak kadar iyi kullanabilen, Photoshop ve Illustrator'e de orta düzey hakimiyeti bulunan, internet üzerinde online kimya dergisi kurmuş ve bunu yüzbinlerce kişiye ulaştırmayı başaran bir grafik sever.
WordPress tarafında 5 adet web sitesi kurmuş, bu sistemler üzerine çalışan bir WordPress sever.
Sosyal medya üzerinde okumalara ve araştırmalara devam eden, kendi kurmuş olduğu kimya dergisini daha çok kişiye nasıl ulaştırırım diye düşünen ve bu konuda SEO çalışmaları üzerine kafa yoran bir Sosyal Medya sever.
Kısaca çok çalışmayı seven, azimli biriyim.