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.
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.