Mikro ERP fn_ Fonksiyonlarını Farklı Şube Veritabanlarına Kopyalama
Mikro ERP güncellendikten sonra bazı şubelerde fn_Aysm fonksiyonları eksik mi? Fonksiyonları kontrol etme, kopyalama ve doğrulama adımları.
Sorun: Bazı Şubelerde Raporlar Çalışmıyor
Mikro ERP’de fn_Aysm adlı fonksiyonlar cari yaşlandırma ve bakiye hesaplama için kullanılır. Sorun şu: Mikro güncellenirken bu fonksiyonlar bazen sadece bazı veritabanlarına ekleniyor.
Merkez DB → fn_Aysm_v2_BakiyeHesapla ✅ var
Adana DB → fn_Aysm_v2_BakiyeHesapla ❌ YOK!
Antalya DB → fn_Aysm_v2_BakiyeHesapla ✅ var
Bursa DB → fn_Aysm_v2_BakiyeHesapla ❌ YOK!
Sonuç: Yaşlandırma sorgusunu çalıştırdığınızda bazı şubelerde Invalid object name 'dbo.fn_Aysm_v2_BakiyeHesapla' hatası alırsınız.
Adım 1: Hangi Şubelerde Eksik?
Tüm veritabanlarını tarayıp fonksiyonun nerede var, nerede yok kontrol edin:
DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql = @sql + '
SELECT ''' + name + ''' AS db_name,
CASE WHEN EXISTS(
SELECT 1 FROM [' + name + '].sys.objects
WHERE name = ''fn_Aysm_v2_BakiyeHesapla'' AND type = ''FN''
) THEN ''✅ MEVCUT'' ELSE ''❌ EKSİK'' END AS durum
UNION ALL'
FROM sys.databases
WHERE name LIKE 'MikroDB%' AND state = 0;
SET @sql = LEFT(@sql, LEN(@sql) - 10);
EXEC sp_executesql @sql;
Çıktı:
db_name | durum
-------------- | ----------
MikroDB_Merkez | ✅ MEVCUT
MikroDB_Adana | ❌ EKSİK
MikroDB_Bursa | ❌ EKSİK
Adım 2: Fonksiyonun Kaynak Kodunu Çıkarma
Fonksiyonun var olduğu bir veritabanından kodunu alın:
USE [MikroDB_Merkez];
-- Fonksiyonun tam kodunu göster
SELECT m.definition
FROM sys.sql_modules m
JOIN sys.objects o ON m.object_id = o.object_id
WHERE o.name = 'fn_Aysm_v2_BakiyeHesapla';
💡 İpucu:
sp_helptextyerinesys.sql_moduleskullanın — tek parçada tam kodu döndürür, satır kesme sorunu olmaz.
Adım 3: Eksik Şubelere Kopyalama
Tek Şubeye Elle Kopyalama
- Kaynak veritabanında fonksiyonu sağ tık → Script Function as → CREATE To
- Hedef veritabanını seçin
CREATE FUNCTIONyerineCREATE OR ALTER FUNCTIONkullanın (SQL Server 2016+)
USE [MikroDB_Adana];
GO
CREATE OR ALTER FUNCTION [dbo].[fn_Aysm_v2_BakiyeHesapla]
(
@CariKod VARCHAR(50),
@BaslangicTarihi DATETIME,
@BitisTarihi DATETIME
)
RETURNS DECIMAL(18,2)
AS
BEGIN
-- Fonksiyon gövdesi kaynak DB'den kopyalanır
DECLARE @Bakiye DECIMAL(18,2) = 0;
-- ...
RETURN ISNULL(@Bakiye, 0);
END;
GO
Tüm Şubelere Otomatik Kopyalama
Birden fazla şubeye tek seferde kopyalamak için:
-- Fonksiyon tanımını kaynak DB'den al
DECLARE @fnDefinition NVARCHAR(MAX);
SELECT @fnDefinition = m.definition
FROM [MikroDB_Merkez].sys.sql_modules m
JOIN [MikroDB_Merkez].sys.objects o ON m.object_id = o.object_id
WHERE o.name = 'fn_Aysm_v2_BakiyeHesapla';
-- CREATE → CREATE OR ALTER dönüşümü
SET @fnDefinition = REPLACE(@fnDefinition,
'CREATE FUNCTION', 'CREATE OR ALTER FUNCTION');
-- Tüm hedef veritabanlarını döngüle
DECLARE @dbName NVARCHAR(128);
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE name LIKE 'MikroDB%' AND name != 'MikroDB_Merkez' AND state = 0;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @dbName;
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
EXEC('USE [' + @dbName + ']; EXEC sp_executesql N'''
+ REPLACE(@fnDefinition, '''', '''''') + '''');
PRINT 'OK: ' + @dbName;
END TRY
BEGIN CATCH
PRINT 'HATA: ' + @dbName + ' - ' + ERROR_MESSAGE();
END CATCH
FETCH NEXT FROM db_cursor INTO @dbName;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
Adım 4: Doğrulama
Kopyalama sonrası tüm şubelerde fonksiyonun çalıştığını kontrol edin — Adım 1’deki sorguyu tekrar çalıştırın. Tüm şubeler ”✅ MEVCUT” göstermeli.
Sık Karşılaşılan Hatalar
Bağımlı Fonksiyonlar
Fonksiyon başka bir fonksiyon veya view’a bağımlı olabilir. Bağımlılıkları kontrol edin:
SELECT referenced_entity_name
FROM sys.dm_sql_referenced_entities('dbo.fn_Aysm_v2_BakiyeHesapla', 'OBJECT');
Farklı Mikro Versiyonları
Farklı şubelerde farklı Mikro versiyonları çalışıyorsa, tablo yapıları farklı olabilir. Fonksiyon bir sütuna referans veriyorsa ve o sütun hedef DB’de yoksa hata alırsınız.
Ne Zaman Yapmalısınız?
| Durum | Aksiyon |
|---|---|
| Mikro güncellendikten sonra | Tüm şubelerde fonksiyonları kontrol edin |
| Yeni şube eklediğinizde | Tüm fn_ fonksiyonlarını kopyalayın |
| Yaşlandırma hata verirse | İlk kontrol: fonksiyon var mı? |
Biz Ne Yaptık?
8 şubeli yapımızda bu süreci tamamen otomatize ettik. Her Mikro güncellemesinden sonra otomatik doğrulama, eksik fonksiyonların tespiti ve kopyalanması, versiyon uyumsuzluğu raporlama.
Bu yazı AstaFlow Case Study serisinin bir parçasıdır.