Forum
Merhaba;
Elimde var olan çalışır durumdaki Databasede bazı tabloları , yine aynı özelliklerdeki diğer databasenin boş olan tablosuna mevcut girdilerimi olduğu gibi aktarmak istiyorum,
Aktarım yaparken yine diğer DB de var olan aynı özelliklerdeki boş Tablo'ya yazsın istiyorum, yani karşı tarafta o tablo var fakat boş.
ikiside aynı serverde aynı alanda farklı db ler.
Burada yaşadığım sorun ise şudur, normal Identity kolon olmayan tabloları aktarıyorum sorun yok fakat, Identity kolonlara identity yi On, Off yaptığım halde sorun yaşıyorum.
Ben alttaki Query yi 2-3 şekilde değiştirdim denedim olmadı, hatam konusunda yardımcı olursanız sevinirim.
SET IDENTITY_INSERT VT_ACCOUNT.dbo._ModuleVersion ON
INSERT INTO VT_ACCOUNT.dbo._ModuleVersion
SET IDENTITY_INSERT VT_ACCOUNT.dbo._ModuleVersion OFF
GO
SELECT * FROM [VT_ACCOUNT1].dbo._ModuleVersion
üstteki sorguda 2 ci SET e kırmızı Vurgu çekmiş oluyor şu hatayı alıyorum
Msg 156, Level 15, State 1, Line 5
Incorrect syntax near the keyword 'SET'.
(178 row(s) affected)
Alttaki şekilde deneyince ise
SET IDENTITY_INSERT VT_ACCOUNT.dbo._ModuleVersion ON
INSERT INTO VT_ACCOUNT.dbo._ModuleVersion
SELECT * FROM [VT_ACCOUNT1].dbo._ModuleVersion
SET IDENTITY_INSERT VT_ACCOUNT.dbo._ModuleVersion OFF
GO
Msg 8101, Level 16, State 1, Line 3
An explicit value for the identity column in table 'SRO_VT_ACCOUNT.dbo._ModuleVersion' can only be specified when a column list is used and IDENTITY_INSERT is ON.
hatasını veriyor
Not:DB VT_ACCOUNT1 veritabanındaki dolu tabloyu, VT_ACCOUNT da var olan boş tabloya aktarmak istiyorum.
Desteğiniz için şimdiden teşekkür ederim.
Burada "SET IDENTITY_INSERT VT_ACCOUNT.dbo._ModuleVersion ON" kısmını ne için kullanıyorsunuz on,off yaparak ve identity üzerine ne tür bir mantık yürütüyorsunuz açıklıyabilir misiniz?
Bu arada trigger de kullanabilirsiniz bu konu ile ilgili böyle bir çalışma yapmayı düşündünüz mü?
Tabloda otomatik artan kolon var, ve karşı tarafında yapısı aynı, On,
Off yapmamdaki amacım bu kolona mevcut kolon kayıtlarını insert
edebilmek.
Trigger konusunda malesef pek fazla bilgim yok, ondan dolayı düşündüm dersem yanlış olur.
Trigger işlemlerini
http://www.cozumpark.com/forums/thread/166982.aspx adresinde Barış bey anlatmış isterseniz bir inceleme yapın bu konu ile ilgili kayıtlarınızın öneminin ne kadar olduğunu tam olarak kestiremiyorum. Burada verilerin önemi yüksekse tabiki farklı şekillerde de kontrol altında tutulabilir duruma getirebilir aslında. İsterseniz konuyu biraz inceleyin üstüne tartışalım Polat bey. İyi çalışmalar.
Verdiğiniz konuyu şimdi okuyacağım fakat öncesinde şunu belirtmek istiyorum.
bu aktarım işlemini ben bir defaya mahsus yapacağım, sürekli ihtiyaç duyduğum bir işlem değil.
ve aktarımdan sonra eski db ilede işim kalmayacak sileceğim.
O halde triggeri rahatlıkla kullanabilirsiniz. Yardımcı olabileceğim farklı konu olursa devam ederim. İyi çalışmalar.
Kenan Bey, Sanırım trigger işlemi ile (yeni olduğumdan olabilir) istediğimi yapamayacağım, benim istediğim basitçe şudur, a nolu db deki artan kolon içeren yani IDENTITY içeren tabloyu b nolu db deki aynı isim ve şekildeki boş tabloya hata almadan aktarmak veya kopyalamak.
bunu basitçe şu şekilde yapabiliyorum
USE VT_TEST
SELECT * INTO VT_TEST2.dbo._kopyalanan
FROM _kopyalanan
fakat bu Query diğer tarafa kendisi tabloyu oluşturup aktarıyor var olana yazmıyor,
Veya bu şekilde IDENTITY içermeyen tablo içeriğini aktarıyorum
USE VT_TEST
INSERT INTO _kopyalanan1 (kolon1, kolon2)
SELECT kolon1, kolon2
FROM _kopyalanan
fakat ben var olan boş ve kolonları hazır tabloya aktarmak istiyorum, sadece IDENTITY içeren tabloyu hata almadan kapyalamak istiyorum diğer db ye.
Polat bey aşağıdaki linkten ulaşabilirsiniz bir döküman hazırladım. İyi çalışmalar.
https://docs.google.com/open?id=0B-4LfaCX5TC9X1FUenQ4U3k0Z0E
Çok teşekkür ederim fakat olmadı, ben size sorguyu veriyorum hatam varsa yazarsanız sevinirm
CREATE TRIGGER [dbo].[trigger_newinsert]
ON [dbo].[_ModuleVersion]
AFTER INSERT
AS
BEGIN
INSERT INTO [VT_ACCOUNT].[dbo].[_ModuleVersion] SELECT
* FROM inserted
END
GO
Verdiği HATA
Msg 8101, Level 16, State 1, Procedure trigger_newinsert, Line 6
An explicit value for the identity column in table 'SRO_VT_ACCOUNT.dbo._ModuleVersion' can only be specified when a column list is used and IDENTITY_INSERT is ON.
Altta tablo yapısı var
qery yi uyararsak aktarmam gereken yaklaşık 20 ye yakın tablo olacak.
Burada yaptığınız hata identity olan kısımları diğer tabloda çakıştırmanız.
Hatalı kısım ;
INSERT INTO [VT_ACCOUNT].[dbo].[_ModuleVersion] SELECT * FROM inserted
Burada her sütunu tek tek yazarak deneyebilirmisin.
VT_ACCOUNT tablosundaki identity olan kısmı almayın. Aynı şekilde _ModuleVersion tablosundaki identity kısmınada gelmemesi lazım bir sütun ilede deniyebilirsiniz.
Örnek;
INSERT INTO [VT_ACCOUNT].[dbo].[_ModuleVersion](nDivisionID) SELECT nDivisionID FROM inserted
Şeklinde deneyebilirmisiniz. Not : _ModuleVersion tablosunda zorunlu sütunlar var ise ondanda problem yaşıyabilirsiniz.
Burada yaptığınız hata identity olan kısımları diğer tabloda çakıştırmanız.
Hatalı kısım ;
INSERT INTO [VT_ACCOUNT].[dbo].[_ModuleVersion] SELECT * FROM insertedBurada her sütunu tek tek yazarak deneyebilirmisin.
VT_ACCOUNT tablosundaki identity olan kısmı almayın. Aynı şekilde _ModuleVersion tablosundaki identity kısmınada gelmemesi lazım bir sütun ilede deniyebilirsiniz.Örnek;
INSERT INTO [VT_ACCOUNT].[dbo].[_ModuleVersion](nDivisionID) SELECT nDivisionID FROM inserted
Şeklinde deneyebilirmisiniz. Not : _ModuleVersion tablosunda zorunlu sütunlar var ise ondanda problem yaşıyabilirsiniz.
identity olmayan kısmı alırken sorun yok, o şekilde alıyorum fakat benim identity alanlarınıda almam gerekiyor, nID bir başka tabloda yine kullanılıyor ve karşılaştırılıyor çünkü,
O kolonu almadan aktarırsam, diğer satırlar için otomatik sayi üretecek ve buda şayet 1 tek satırda sapma dahi olsa soruna yol açacaktır.
O halde şu şekilde bir işlem yapmanız lazım ikinci tablonuzda identity oluşturmuyacaksınız nID kısmı identity özelliği kapatarak sadece index özelliğini açıcaksınız. İlk tablonuzdaki nID sütunu ikinci tablonuzdaki nID tablonuza girişi yapacaksınız. Burada ikinci tabloya geçen verilerin mükerrer olma şansı tabi olur ki triggerte sanmıyorum o kadar risk olacağını. Sonuç olarak identity yi açıp kapatarak zaten ikinci tabloya nID leri girmeye çalışıyordunuz önceki mantığınızda.
Kenan Bey;
DB ve Tablo hazır bir tablo, ben oluşturmuyorum, yapı olarak zaten boş şekilde ve kolonları yapılı duruyor 2 ci tablo, ben aktarırken, var olan identity li kolondan, yine karşıda var olan idendity li kolona yazmam lazım
El ile manuel olarak 2ci tablodaki idendity kolonunun idendity özelliğini kaldırmak istediğimde save yapmıyor nedese, kolonun özelliğini değiştiremedim yani.
SQL Server yeni kurulumlarından sonra oluşturulan tabloları değiştirebilmek için "Prevent saving changes that require table re-creation" özelliğini kapatmanız gerekmektedir.
Tools > Options > Designers > Prevent saving changes that require table re-creation kısmından kaldırdıktan sonra işleminizi tekrar deneyiniz.
polat33 Merhaba
Sanırım sende benim gibi Sro için çabalıyorsun 🙂
Bu ne için lazım olucak sana ne için istiyorsun onu yazabilirsen sana alternatif çözüm söyleyebilirim.
Sro Derken Silkroad mı ?
Evet.
İsa Bey Merhaba;
Evet Söz konusu database silkroad databasesi, fakat ben sunucu hizmeti demeyeyimde, desteği veriyorum ve sürekli database çökmeleri gibi hatalar alıyoruz, şikayetler alıyoruz, o durumda kişiye tutupda al sana yedeğin dediğimizde çok da işine yaramıyor, çünkü mevcut veirleri yok olmuş oluyor, fakat var olan sorunlu databasesindeki bilgileri identity ler ile beraber aktarma gibi bir şansımız olursa , o zaman alternatif çözüm üretmiş oluruz ve kişi emek kaybına uğramaz.
bu işlem daha çok user bilgilerini ve hesaplarını olduğu gibi başka bir db ye geçirmek için lazım, veya bozulan db yi yedek db ye aktarmak için.
Alternatif çözümünüzü merak ettim.