1-) MSSQL RMOS - otomatik log tablosu oluşturma procedürü BAŞKA VERİ TABANINA!
2-) Model (Bu kısım her veritabanında olacak. Log için sabit alanlar)
CREATE TABLE [dbo].[Log](
[Log_id] [int] IDENTITY(1,1) NOT NULL,
[Log_Islem_Tarihi] [datetime] NULL,
[Log_Islem] [char](10) NULL,
[Log_session_ID] [nvarchar](50) NULL,
[Log_IPAddress] [nvarchar](50) NULL,
[Log_MachineName] [nvarchar](50) NULL,
[Log_LoginName] [nvarchar](50) NULL,
[Log_ApplicationName] [nvarchar](250) NULL,
CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED
(
[Log_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
3-) örnek bir tablo
CREATE TABLE [dbo].[Telefonlar](
[telefon_id] [int] IDENTITY(1,1) NOT NULL,
[telefon_Ad] [nvarchar](30) NULL,
[telefon_SoyAd] [nvarchar](30) NULL,
[telefon_No] [nvarchar](30) NULL,
CONSTRAINT [PK_Telefonlar] PRIMARY KEY CLUSTERED
(
[telefon_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
4-) otomatik log tablosu oluşturma procedürü
-- Kullanımı -> exec Log_Olustur 'Log','Telefonlar','RM_Log' -> Log ve Telefonlar tablosunu orjinal DB de olacak. RM_Log veri tabanı ise Log için Açılmış olan veri tabanıdır
-- Log'da belirli bir değerin son 3 olayının değerini görmek için yazılan sorgu aşağıdadır. not : En son yapılan işlem en üsttedir
-- select top 3 * from Log_Telefonlar where telefon_id=5 order by Log_id desc
Create proc [dbo].[Log_Olustur](@tableName_Model nvarchar (100),@tableName_Neyi nvarchar (100),@tasinacakDB nvarchar(100))
as begin
declare @Log_PK nvarchar(100)=(SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1
AND TABLE_NAME = @tableName_Model)
declare @tableName_Nereye nvarchar(50)=@tableName_Model+'_'+@tableName_Neyi
declare @rowcount nvarchar(MAX)
if (object_id(@tableName_Nereye, 'U') is not null)
begin select 'çalıştırmış olduğun DB de tablo zaten var! Lütfen silip tekrar deneyin. -> ' + @tableName_Nereye as UYARI end
else begin
declare @createTablo nvarchar(200)='select * into '+@tableName_Nereye+' from '+@tableName_Model+' where 1=0;ALTER TABLE '+@tableName_Nereye+' ADD PRIMARY KEY('+@Log_PK+');'
exec sp_executesql @createTablo, N'@rowcount int output', @rowcount output;
DECLARE @myTableVariable TABLE (kod varchar(2000))
INSERT INTO @myTableVariable
SELECT 'ALTER TABLE dbo.'+@tableName_Nereye+' ADD ' + c.Name + ' ' +
CASE WHEN c.is_computed = 1 THEN 'AS ' + cc.definition
ELSE t.Name +
CASE WHEN c.is_identity = 1
THEN '' -- yorum satırı yaptım -> ' IDENTITY(' + CONVERT(VARCHAR(10), ic.seed_value) + ',' + CONVERT(VARCHAR(10), ic.increment_value) + ')'
WHEN t.name IN ('CHAR', 'NCHAR', 'VARCHAR', 'NVARCHAR', 'DATETIME2')
THEN '(' + CONVERT(VARCHAR(10), c.max_length) + ')'
WHEN t.name IN ('NUMERIC', 'DECIMAL')
THEN '(' + CONVERT(VARCHAR(10), c.precision) + ', ' + CONVERT(VARCHAR(10), c.scale) + ')'
ELSE ''
END
END + ';
' as kod
FROM sys.columns AS c
INNER JOIN sys.types AS t
ON t.system_type_id = c.system_type_id
AND t.user_type_id = c.user_type_id
LEFT JOIN sys.computed_columns AS cc
ON cc.object_id = c.object_id
AND cc.column_id = c.column_id
LEFT JOIN sys.identity_columns AS ic
ON ic.object_id = c.object_id
AND ic.column_id = c.column_id
WHERE c.object_id = OBJECT_ID(N'dbo.'+@tableName_Neyi+'', 'U')
AND NOT EXISTS
( SELECT 1
FROM sys.columns AS c2
WHERE c2.object_id = OBJECT_ID(N'dbo.foo_mod')
AND c2.name = c.name
)
ORDER BY c.column_id;
select * from @myTableVariable
Declare @kodlar nvarchar(200)
While (Select Count(*) From @myTableVariable) > 0
Begin
Select Top 1 @kodlar = kod From @myTableVariable
declare @gecici nvarchar(MAX)=REPLACE(@kodlar, '-1', 'MAX')
set @gecici =REPLACE(@gecici, 'decimal', 'decimal(18,5)')
select 'oldu '+@gecici
--Do some processing here
exec sp_executesql @gecici,N'@rowcount int output', @rowcount output;
Delete @myTableVariable Where kod = @kodlar
End
-- diğer veri tabanını oluşturma ve tabloları ona aktarma
declare @tasinacakTabloTamisim nvarchar(50)=@tasinacakDB+'.dbo.'+@tableName_Nereye
-- select @tasinacakTabloTamisim
set @Log_PK =(SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1
AND TABLE_NAME = @tableName_Nereye
)
--select @Log_PK
set @createTablo='CREATE DATABASE '+@tasinacakDB
declare @createTablo1 nvarchar(200)='select * into '+@tasinacakTabloTamisim+' from '
+@tableName_Nereye+' where 1=0;ALTER TABLE '+@tasinacakTabloTamisim+' ADD PRIMARY KEY('+@Log_PK+'); drop table '+@tableName_Nereye+';'
--select @createTablo
If(db_id(@tasinacakDB) IS NULL) begin exec sp_executesql @createTablo, N'@rowcount int output', @rowcount output; end
if (object_id(@tasinacakTabloTamisim, 'U') is not null)
begin select @tasinacakTabloTamisim+'-> tablo zaten var! Lütfen silip tekrar deneyin.' as UYARI end
else begin
exec sp_executesql @createTablo1, N'@rowcount int output', @rowcount output;
end
End
End
/*--AKTARMA KONTROL
use deneme1
declare @TABLE_CATALOG nvarchar(50)='deneme1' --Nereden DB
declare @TABLE_SCHEMA nvarchar(50)='dbo' --Nereden tablo Schema
declare @TABLE_NAME nvarchar(50)='Telefonlar' --Nereden tablo
declare @TABLE_CATALOG1 nvarchar(50)='RM_Log' --Nereye DB
declare @TABLE_SCHEMA1 nvarchar(50)='dbo' --Nereye tablo Schema
declare @TABLE_NAME1 nvarchar(50)='Log_Telefonlar' --Nereye tablo
DECLARE @DEGER1 NVARCHAR(20)=(SELECT COUNT(COLUMN_NAME)+8 as 'COLUMN SAYISI'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = @TABLE_CATALOG AND TABLE_SCHEMA = @TABLE_SCHEMA
AND TABLE_NAME = @TABLE_NAME)
use RM_Log
DECLARE @DEGER2 NVARCHAR(20)=(SELECT COUNT(COLUMN_NAME) as 'COLUMN SAYISI'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = @TABLE_CATALOG1 AND TABLE_SCHEMA = @TABLE_SCHEMA1
AND TABLE_NAME = @TABLE_NAME1)
if @DEGER1=@DEGER2 begin select 'Column Sayıları Eşittir' as 'DURUM' end else begin select 'Column Sayıları Eşit Değildir!' as 'DURUM' end
*/
4-) Son olarak Triggerimizi oluşturalım
Create TRIGGER Trigger_Telefonlar
ON Telefonlar FOR INSERT, UPDATE, DELETE NOT FOR REPLICATION
AS
SET NOCOUNT ON;
--INSERT,UPDATE yada DELETE işlemi olduğunu belirleme
--Ramazan HABER
declare @session_ID nvarchar(50)
declare @IPAddress nvarchar(50)
declare @MachineName nvarchar(50)
declare @LoginName nvarchar(50)
declare @ApplicationName nvarchar(250)
set @session_ID=(SELECT conn.session_ID FROM sys.dm_exec_connections conn inner join sys.dm_exec_sessions sess on conn.session_ID=sess.session_ID where conn.session_ID=@@SPID)
set @IPAddress=(SELECT conn.client_net_address FROM sys.dm_exec_connections conn inner join sys.dm_exec_sessions sess on conn.session_ID=sess.session_ID where conn.session_ID=@@SPID)
set @MachineName=(SELECT sess.host_name FROM sys.dm_exec_connections conn inner join sys.dm_exec_sessions sess on conn.session_ID=sess.session_ID where conn.session_ID=@@SPID)
set @LoginName=(SELECT login_name FROM sys.dm_exec_connections conn inner join sys.dm_exec_sessions sess on conn.session_ID=sess.session_ID where conn.session_ID=@@SPID)
set @ApplicationName=(SELECT sess.program_name FROM sys.dm_exec_connections conn inner join sys.dm_exec_sessions sess on conn.session_ID=sess.session_ID where conn.session_ID=@@SPID)
--Ramazan HABER
DECLARE @operation as Varchar(10)
DECLARE @Count as int
SET @operation = 'Inserted' -- Setting operation to 'Inserted'
SELECT @Count = COUNT(*) FROM DELETED
if @Count > 0
BEGIN
SET @operation = 'Deleted' -- Set Operation to 'Deleted'
SELECT @Count = COUNT(*) FROM INSERTED
IF @Count > 0
SET @operation = 'Updated' -- Set Operation to 'Updated'
END
--Silme işlemini yakala
if @operation = 'Deleted'
BEGIN -- BAŞKA VERİ TABANINA AKTARMAK İÇİN *RM_Log.dbo.Log_Telefonlar* ŞEKLİNDE YAPILABİLİR
Insert into RM_Log.dbo.Log_Telefonlar(Log_Islem_Tarihi,Log_Islem ,Log_session_ID ,Log_IPAddress ,Log_MachineName ,Log_LoginName ,Log_ApplicationName ,telefon_id,telefon_Ad,telefon_SoyAd,telefon_No)
SELECT GETDATE() ,'Deleted' ,@session_ID ,@IPAddress ,@MachineName ,@LoginName ,@ApplicationName ,telefon_id,telefon_Ad,telefon_SoyAd,telefon_No from deleted
END
ELSE
BEGIN
--trigger, insert ve update için aynı davranır.Burada belirtebiliriz.
--SELECT GETDATE(),'inserted',id,ad,soyad from inserted
--Yeni kayıt işlemini yakala
if @operation = 'Inserted'
BEGIN
Insert into RM_Log.dbo.Log_Telefonlar(Log_Islem_Tarihi,Log_Islem ,Log_session_ID ,Log_IPAddress ,Log_MachineName ,Log_LoginName ,Log_ApplicationName ,telefon_id,telefon_Ad,telefon_SoyAd,telefon_No)
SELECT GETDATE() ,'inserted' ,@session_ID ,@IPAddress ,@MachineName ,@LoginName ,@ApplicationName ,telefon_id,telefon_Ad,telefon_SoyAd,telefon_No from inserted
END
-- Güncelleme işlemini yakala
ELSE
BEGIN
INSERT INTO RM_Log.dbo.Log_Telefonlar(Log_Islem_Tarihi,Log_Islem ,Log_session_ID ,Log_IPAddress ,Log_MachineName ,Log_LoginName ,Log_ApplicationName ,telefon_id,telefon_Ad,telefon_SoyAd,telefon_No)
SELECT GETDATE() ,'Updated' ,@session_ID ,@IPAddress ,@MachineName ,@LoginName ,@ApplicationName ,telefon_id,telefon_Ad,telefon_SoyAd,telefon_No from inserted
END
END
5-) COLUMN'LARI DOĞRU AKTARMIŞ MI DİYE COLUMN SAYILARININ DOĞRULUĞUNU KONTROL EDER
--AKTARMA KONTROL
use deneme1
declare @TABLE_CATALOG nvarchar(50)='deneme1' --Nereden DB
declare @TABLE_SCHEMA nvarchar(50)='dbo' --Nereden tablo Schema
declare @TABLE_NAME nvarchar(50)='Telefonlar' --Nereden tablo
declare @TABLE_CATALOG1 nvarchar(50)='RM_Log' --Nereye DB
declare @TABLE_SCHEMA1 nvarchar(50)='dbo' --Nereye tablo Schema
declare @TABLE_NAME1 nvarchar(50)='Log_Telefonlar' --Nereye tablo
DECLARE @DEGER1 NVARCHAR(20)=(SELECT COUNT(COLUMN_NAME)+8 as 'COLUMN SAYISI'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = @TABLE_CATALOG AND TABLE_SCHEMA = @TABLE_SCHEMA
AND TABLE_NAME = @TABLE_NAME)
use RM_Log
DECLARE @DEGER2 NVARCHAR(20)=(SELECT COUNT(COLUMN_NAME) as 'COLUMN SAYISI'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = @TABLE_CATALOG1 AND TABLE_SCHEMA = @TABLE_SCHEMA1
AND TABLE_NAME = @TABLE_NAME1)
if @DEGER1=@DEGER2 begin select 'Column Sayıları Eşittir' as 'DURUM' end else begin select 'Column Sayıları Eşit Değildir!' as 'DURUM' end