9 Eylül 2012 Pazar

Sql'de Linked Server Olmadan Uzaktaki Sunucuya Bağlantı


Bildiğiniz gibi LinkedServer tanımlayarak A server’ı üzerinden B Server’ında select,update gibi işlemleri yapabilmemiz mümkün.
Bugün anlatacağım OpenDataSource komutu ile linked server’a gerek kalmadan bu işlemleri nasıl yapabileceğimizi görüyor olacağız.
OpenDataSource kullanılabilmesi için sorguyu çalıştıran server’da Ad Hoc Distributed Queriesözelliğinin enable edilmesi gerekmektedir.
Aksi halde şöyle bir hata alınır.
Msg 15281, Level 16, State 1, Line 1 
SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', see "Surface Area Configuration" in SQL Server Books Online.
Ad Hoc Distributed Queries özelliğini aktif etmek için sorguyu çalıştıran server’da şu script’i çalıştırabilirsiniz.
1exec sp_configure 'show advanced options',1
2ReConfigure with override
3exec sp_configure 'Ad Hoc Distributed Queries',1
4ReConfigure with override
5exec sp_configure 'show advanced options',0
6ReConfigure with override
Şimdi kullanıma bakalım.
1SELECT top 10 * FROM OPENDATASOURCE( 'SQLOLEDB', 
2'Data Source=Server2\sql2008;User ID=LoginName;Password=Password').ADRES.dbo.IL 





SQL Server Management Stdio Üzerinde Kullanıcıların Görebildikleri Veritabanı Listesini Kısıtlamak


SQL Server güvenliğinde sık karşılaştığımız sorulardan biri de kullanıcının yetkisi olmadığı halde SQL Server Management Stdio kullanarak SQL Servera bağlandıklarında tüm veritabanlarını görmelerinin nedenidir. Aslında bu durum SQL Server ile doğrudan ilişkili değildir. SQL Serverı yönetmek için kullandığımız araç olan SQL Server Management Stdio aracının tasarımı yapılırken hızlı açılabilmesi için dinamik olarak oluşturulan ve SQL Server objelerinin listelendiği Object Explorer penceresi oluşturulduğunda herhangi bir kontrol yapılması şeklinde tasarlanmıştır. Hatta yetkiden bağımsız olarak kimsenin erişmeyeceği Offline durumdaki veritabanları bile kontrol edilmeden listelenmektedir.
Daha teknik bir ifadeyle konuyu açıklayacak olursak SQL Server her kullanıcımızın üye olduğu public adında bir rol vardır ve varsayılan olarak bu role VIEW ANY DATABASE yetkisi verilmiştir. Yani bu role sahip her kullanıcı yetkisi olmasa bile erişim hakkı olmaz ama tüm veritabanlarının listesini Object Explorer penceresinde görebilmektedir. Bu nedenle eğer tüm kullanıcılardan veritabanı listesinin gizlemek istiyorsak public rolünden bu yetkiyi almamız gerekmektedir. Aynı şekilde sadece bir kullanıcıdan da bu yetkiyi alarak sadece bir kullanıcının tüm veritabanları görmesini engelleyebiliriz. Şimdi hemen bir uygulama üzerinde bu işlemi yapalım. İlk adım olarak bir kullanıcı oluşturalım ve hiç yetki vermeyelim.


8 Eylül 2012 Cumartesi

SQL'de Insert Yöntemleri


Sql Üzerinde birden fazla Insert Yöntemi vardır. Bu her farklı yöntem doğru kullanılırsa hayat kurtarmakta üzerine yoktur. Metod 1'i sql'e tek veri eklemekte kullanabilirsiniz, Metod 2'yi ise farklı tablo veya view ile insert yapmakta kullanabilirsiniz Metod 3 ise visual studio ile aktarımda yardımınıza koşacaktır. İşte size örnekler;

-- Sql Server'a Temp Tablo açılması
CREATE TABLE #SQLTempTable (ID INTValue VARCHAR(100));

Method 1: Traditional Method of INSERT…VALUE
-- Method 1 - Genel Insert Kullanımı
INSERT INTO #SQLTempTable (IDValue)VALUES (1'First');
INSERT INTO #SQLTempTable (IDValue)VALUES (2'Second');
INSERT INTO #SQLTempTable (IDValue)VALUES (3'Third');
-- Temizleme
TRUNCATE TABLE #SQLTempTable;
-------------------------------------------------------------------------------
Method 2: INSERT…SELECT
-- Method 2 - Select Union Insert Yöntemi
INSERT INTO # SQLTempTable (IDValue)
SELECT 1'First' 
UNION ALL 
SELECT 2'Second' 
UNION ALL 
SELECT 3'Third';

-- Temizleme 
TRUNCATE TABLE #SQLTempTable;
------------------------------------------------------------------------------
Method 3: SQL Server 2008+ Row Construction
-- Method 3 - SQL Server 2008+ Row Construction Yöntemi
INSERT INTO #SQLTempTable (IDValue)
VALUES (1'First'), (2'Second'), (3'Third');
-- Temizleme 
DROP TABLE #SQLTempTable;

Raporlarda TL yazıyla Kullanımı (Rakamı Yazıya Çevirir)


Crystal Reports'ta Rakam gelen alanları yazıya çevirmek bazen işkence olabiliyor ama bununda kolayı var tabi ki yeni bir formul ekliyorsunuz ve aşağıdaki kodları yapıştırıyorsunuz. Burada tek yapmanız gereken Formul  eklerken Syntax'ı "Crystal Syntax"'tan "Basic Syntax"'a çevirmek olacaktır.

Dim SencerDegisken As Number
Dim SolTaraf As String
Dim SagTaraf As String
Dim SolYuzler As String
Dim SolOnlar As String
Dim SolOnlarbas As String
Dim SolBirler As String
Dim SolDüzeltme As String
Dim SagYuzler As String
Dim SagOnlar As String
Dim SagOnlarbas As String
Dim SagBirler As String
Dim SagDüzeltme As String

SencerDegisken = Sum ({@TOPLAM})

Sql Serverda Tablo Kopyalamak


Sql Serverda herhangi bir veri tabanındaki bir tabloyu, başka bir veritabanına taşımak için;
SELECT * INTO vt1.dbo.yenitablo FROM vt2.dbo.kopyalanacaktablo
şeklinde bir komut kullanılabilir. Bu komut ile vt1 veritabanı altına yenitablo isimli bir tablo oluşturulur ve vt2 veritabanındaki kopyalanacaktablo isimli tablodaki veriler bu tabloya taşınır.

Sql'de Var Olan Tabloları Coloumları ve Viewları Listelemek

Sql'de olan Tabloları ve Viewları listelemek ve bunlarla dinamik bir yapı oluşturmak istiyorsanız bu iki komut sizin hayatınızı kurtaracaktır. Tablo ve Veiw'lar hakkında daha fazla bilgi isterseniz eğer "name" yerine "*" kullanmanız yeterli olacaktır.
SELECT name FROM sys.tables
SELECT name FROM sys.views
Eğer Database ile birlikte tablo isimlerini listelemek isterseniz;
SELECT * FROM INFORMATION_SCHEMA.Tables
 Eğer Coloum isimleri ile birlikte tablo isimlerini listelemek isterseniz;

SELECT t.name As TableName, c.Column_Name
from sys.tables t
INNER JOIN INFORMATION_SCHEMA.COLUMNS c ON c.Table_Name = t.Name
ORDER BY t.name 

c# ile temp dizinine ulaşmak

C# ile Temp dizini yolunu almak.(Getting temp directory active user wtih c#) Programı kurduğunuz bilgisayarda temp dizinine ulaşmanız gerekbilir.Her bilgisayarda temp dizini aynı path'a sahip değildir. administrator seçeneğini ise her zaman kullanamayabiliriz.Çünkü erişim iznimiz olamayabilir. Allusers seçeneği ise her kullanıcıya açık hale getirecektir.Bunun yerine aktif kullanıcının temp dizinine ulaşmak için şu iki seçenekten biriniz kullanabilirsiniz.
string tempPath = System.IO.Path.GetTempPath();
ya da
string strTmp= System.Environment.GetEnvironmentVariable("TEMP");
seçenklerinden biri ile elde edebiliriz.

SQL Server 2012 , 2008 ve 2008 R2'de veritabanı log dosyasını temizleme - boyutunu düşürme

Yönettiğim sistemlerde SQL veritabanlarında log yedeği (log backup) alabilmek ve gerektiğinde belirli bir zaman geri dönebilmek için recovery model olarak Full seçiyorum. Bir veritabanının recovery modelini SQL Server 2000'de SQL Server Enterprise Manager, SQL Server 2005/2008/2008 R2/2012'de SQL Server Management Studio'da veritabanına sağ tıklayıp Properties'e basıldığında görüntülenen ekranda yeralan Options bölümünden ayarlayabiliyoruz.
Recovery modelin Full olması, özellikle üzerinde çok fazla değişiklik gerçekleşen veritabanlarında bir süre sonra log dosyası boyutunun çok büyümesine, hatta veritabanının boyutunu geçmesine neden olabiliyor. Veritabanının yedeğini düzenli olarak alıyorsanız log dosyasını arada bir temizlemek hem diskte yer kaplaması açısından hem de veritabanının performansı açısından önemlidir. SQL Server 2000 ve 2005 versiyonlarında aşağıdaki komutlar ile veritabanı log dosyasının boyutunu sıfırlamak mümkün :
USE veritabaniadi GO BACKUP LOG veritabaniadi WITH TRUNCATE_ONLY DBCC SHRINKFILE(veritabaniadi_log) GO
Ancak bu işlemi SQL Server 2008 ve 2008 R2 versiyonlarında gerçekleştirmek istediğiniz aşağıdaki hata mesajı ile karşılaşıyoruz : Msg 155, Level 15, State 1, Line 1 'TRUNCATE_ONLY' is not a recognized BACKUP option. Bu hatanın sebebi, artık TRUNCATE_ONLY komutunun desteklenmiyor olması. Peki, SQL Server 2008 ve 2008 R2'de log dosyasını temizlemek için var mı? Elbette var! Aşağıdaki komutlar ile veritabanı log dosyasını temizleyebiliyoruz :
USE veritabaniadi GO ALTER DATABASE veritabaniadi SET RECOVERY SIMPLE WITH NO_WAIT DBCC SHRINKFILE(veritabani_log) ALTER DATABASE veritabaniadi SET RECOVERY FULL WITH NO_WAIT GO
Bu komutlarla yaptğımız işlem recovery modeli Simple olarak değiştirmek, log dosyasını temizlemek ve recovery modeli tekrar Full olarak değiştirmek. NOT : DBCC SHRINKFILE(veritabani_log) satırlarında geçen veritabani_log kısmı veritabanının log dosyasının adıdır. Fiziksel dosya adı ile aynı olmayabilir. Bu adı veritabanının Properties ekranındaki Files bölümündeki Logical Name kısmından veya aşağıdaki komutları çalıştırıp ekrana gelen sonuçtaki Name bölümünden görebilirsiniz.
USE veritabaniadi GO SELECT * FROM sys.database_files