Database Management System-DBMS(Veritabanı Yönetim Sistemleri – VTYS)’larda veritabanının sahip olduÄŸu nesneler hakkında bilgi almak, metadalarını(veri nesneleri hakkında veri tablosu) sorgulamak için bazı yöntemler sunulur. Bunlardan bir tanesi ANSI_SQL standartı olan INFORMATION_SCHEMA ile baÅŸlayan metadata viewleri diÄŸer yöntem ise sistem tablolarıdır. Bu bilgiler, bir uygulamanın database katmanı için kodları generate etmekte kullanıldığı gibi SQL Injection gibi kötü niyetler için de kullanılmaktadır. Ayrıca database üzerinde yeni bir nesne oluÅŸturulacağı zaman onun önceden var olup olmadığını kontrol etmek veya nesneyi silmeye çalıştığımızda gerçekten veritabanında öyle bir nesnenin olduÄŸundan emin olmak için veritabanının metaverisini sorgulamak iÅŸlemlerin doÄŸru sonuçlanması açısından önemlidir.
SQL Server’da kullanılan metadata viewleri ÅŸunlardır;
- CHECK_CONSTRAINTS,
- COLUMN_DOMAIN_USAGE
- COLUMN_PRIVILEGES
- COLUMNS
- CONSTRAINT_COLUMN_USAGE
- CONSTRAINT_TABLE_USAGE
- DOMAIN_CONSTRAINTS
- DOMAINS
- KEY_COLUMN_USAGE
- PARAMETERS
- REFERENTIAL_CONSTRAINTS
- ROUTINE_COLUMNS
- ROUTINES
- SCHEMATA
- TABLE_CONSTRAINTS
- TABLE_PRIVILEGES
SELECT * FROM INFORMATION_SCHEMA.TABLES
ifadesi kullanılır. Bu ifadeyi Northwind için 5 tane kayıt getirecek şekilde çalıştırdığımızda aşağıdaki sonuçları elde ederiz.
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE |
|---|---|---|---|
| Northwind | dbo | Orders | BASE TABLE |
| Northwind | dbo | Products | BASE TABLE |
| Northwind | dbo | Order Details | BASE TABLE |
| Northwind | dbo | Customer and Suppliers by City | VIEW |
| Northwind | dbo | Alphabetical list of products | VIEW |
SQL Server’da bu viewler her databasein altında bulunur. “dbo” kullanıcısının altında bulunmadıkları için her veritabanının altında karşılık sistem tabloları kullanılır. DB2′taki System Catalog, Oracle’daki Data Dictionary yapılarına denk gelen bu tabloların bazıları master databaseinde bulunup sistem düzeyinde veriler içerir bazıları da her databaseinde altında bulunup o databasein sahip olduÄŸu nesne ve kaynaklar hakkında veri taşırlar. Sistem tabloların isimleri, “sys” sözcüğüyle baÅŸlar. Fakat “sys” ile baÅŸlayan her nesne, sistem tablosu deÄŸildir. Her sistem tablosunun bir ID’si olup databaseler altında bulunan sysobjects tablosunda tanımlıdırlar. Sistem tablolarında SQL Server’daki veritabanlarına ait tüm metadata bilgileri bulunur. Mesela, konunun başında bahsettiÄŸimiz metada viewlerinin listesine ulaÅŸmak için aÅŸağıdaki sorguyu çalıştırabiliriz.
SELECT * FROM master.dbo.sysobjects WHERE uid=3
Sistem databaselerin altında farklı sistem tabloları bulunsa da en çok kullanılan sistem tabloları şunlardır;
- sysservers (Master – REMOTE SERVICES)
- sysprocesses (Master – ACTIVE USER PROCESSES)
- syslogins (Master – REMOTE SERVICES)
- sysremotelogins (Master – REMOTE SERVICES)
- syscursors (Master – CURSORS)
- sysconfigures (Master – CONFIGURATION)
- sysdevices (Master – STORAGE)
- sysaltfiles (Master – STORAGE)
- syslanguages (Master)
- sysmessages (Master)
- sysdatabases (Master)
- syscharsets (Master)
- sysmembers (Model – USERS & PERMISSIONS)
- sysusers (Model – USERS & PERMISSIONS)
- syspermissions (Model – USERS & PERMISSIONS)
- syscomments (Model – OBJECTS)
- sysobjects (Model – OBJECTS)
- sysdepends (Model – OBJECTS)
- sysconstraints (Model – OBJECTS)
- sysindexes (Model – OBJECTS)
- syscolumns (Model – OBJECTS)
- systypes (Model – OBJECTS)
- sysforeignkeys (Model – OBJECTS)
- sysreferences (Model – OBJECTS)
- sysindexkeys (Model – OBJECTS)
- sysfiles (Model – STORAGE)
- sysfilegroups (Model – STORAGE)
- sysallocations (Model – STORAGE)
- backupset (Msdb – BACKUP)
- backupfile (Msdb – BACKUP)
- restorehistory (Msdb – BACKUP)
- restorefilegroup (Msdb – BACKUP)
- restorefile (Msdb – BACKUP)
- sysalerts (Msdb – SQL SERVER AGENT)
- sysoperators (Msdb – SQL SERVER AGENT)
- sysjobhistory (Msdb – SQL SERVER AGENT)
- sysjobsteps (Msdb – SQL SERVER AGENT)
- syscategories (Msdb – SQL SERVER AGENT)
- sysjobs (Msdb – SQL SERVER AGENT)
- sysjobschedules (Msdb – SQL SERVER AGENT)
- sysjobservers (Msdb – SQL SERVER AGENT)
- sysdtspackages (Msdb – DTS)
- sysdtscategories (Msdb – DTS)
- sysdbmaintplans (Msdb – DATABASE MAINTENANCE)
- sysdbmaintplan_databases (Msdb – DATABASE MAINTENANCE)
- sysdbmaintplan_history (Msdb – DATABASE MAINTENANCE)
- sysdbmaintplan_jobs (Msdb – DATABASE MAINTENANCE)
SQL Server’in sistem tablolarında nesneler, birer ID ile temsil edilir. Object Identification Number olarak tanımlanan bu ID bilgisi nesneleri, diÄŸer nesnelerden ayırmış olur. SQL Server’da aynı isimde farklı türde iki nesne olabileceÄŸi için bunları ancak ID’lerinden ayırabiliriz. Yani Email isminde hem bir Table hem de bir stored procedure nesnesi olabilir. sysobjects tablosunda bu nesnelerin ID’leri “object_id”, isimleri “name”, tür bilgileri de “type” ve “type_desc” kolonlarında tutulmaktadır. Dolayısıyla bir nesne yaratacağımız zaman öncelikle bu tabloyu bu kolonlarla sorgulamalıyız ki querymiz hata vermesin. Bu sorgulamayı isimle yapabileceÄŸimiz gibi ID ile yapmamız daha doÄŸru olacaktır. SQL Server, herhangi bir nesnenin ID ve türünü kolayca öğrenmemiz için OBJECT_ID ve OBJECTPROPERTY fonksiyonlarını sunar. OBJECT_ID, parametre olarak char veya nchar türünde deÄŸer alır.
USE master
SELECT OBJECT_ID('pubs..authors')
ifadesi, 1977058079 deÄŸerini döndürür.OBJECTPROPERTY fonksiyonu ise id ve property isminde iki parametre alır. Buradaki property parametresi, sorgulanan nesnenin tür bilgisini ifade eder. ÖrneÄŸin “IsTable” ifadesi, nesnenin table olup olmadığını, “IsTrigger” ifadesi, nesnenin trigger olup olmadığını döndürür. Åžimdi bir örnek yapalım. DENEME isimli databasede L_User tablonun olup olmadığını kontrol edelim.
USE DENEME if exists ( select * from dbo.sysobjects where id = object_id(N'L_User') and OBJECTPROPERTY(id, N'IsUserTable') = 1 ) print 'Tablo Var' else print 'Tablo Yok'
SQL 2005′te sistem tabloları mantıksal olarak yukarıda bahsettiÄŸimiz databaseler altında bulunsa da fiziksel olarak RDB olarak isimlendirilen bu sürümle birlikte gelmiÅŸ olan Resource database‘inde bulunur. mdf dosyası mssqlsystemresource.mdf olarak tanımlanmış olan bu database, readonly olup sadece SQL Server 2005′in sistem nesnelerini içerir, user veya sistem data veya metadata bilgisi içermez. Bütün sistem objeleri, fiziksel olarak bu veritabanının altında bulunur ancak bütün veritabanlarının sys schemasına mantıksal olarak baÄŸlanmıştır. Onun için herhangi bir databaseden rahatlıkla eriÅŸilebilirler. Bütün sistem objelerine eriÅŸmek aÅŸağıdaki query çalıştırılabilir;
SELECT name as object_name, object_definition(object_id) as sql_tanimlama FROM sys.system_objects
L_User örneğini SQL 2005 için şu şekilde uyarlayabiliriz;
USE DENEME IF NOT EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[EMAIL]') AND type in (N'U') ) print 'Tablo Var' else print 'Tablo Yok'
Yeri gelmişken bu Resource database ile ilgili birkaç cümle daha yazmak faydalı olacaktır. Bu database içerisinde neler olduğunu öğrenmek için şu şekilde bir yanıltma işlemi yapabiliriz.
- Öncelikle servislerin altındaki Microsoft SQL Server 2005 system service (SQL Server (MSSQLSERVER)) servisini durduralım.
- mssqlsystemresource.mdf dosyasını mssqlsystemresource_copy.mdf ve mssqlsystemresource.ldf dosyasını mssqlsystemresource_copy.ldf olarak kopyalarını oluşturalım.
- SQL Server (MSSQLSERVER) servisini başlatalım.
- Kopyalarını aldığımız mdf ve ldf dosyalarını aşağıdaki gibi attach edelim.
EXEC sp_attach_db 'MSSQLServerResource_Copy', 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\MSSQLSystemResource_copy.mdf', 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\MSSQLSystemResource_copy.ldf'
SQL Server Management Studio’ı kullanarak ta farklı bir database ismiyle Resource databasein kopyasını attach edebiliriz.
Resource veritabanı, master veritabanının bulunduÄŸu yerle iliÅŸkilidir. master veritabanını baÅŸka yere taşığımızda Resource database’i de o lokasyona taşımalıyız.Resource veritabanını NTFS ile compress veya encrypt edilmiÅŸ bir klasörde saklamamalıyız. Bu durum, performansı ve güncellemeyi engelleyecektir.
Resource veritabanının yedeÄŸi SQL Server Management Studio ve T-SQL koduyla alınmaz. Böyle bir durumda mssqlsystemresource.mdf ve mssqlsystemresource.ldf dosyalarının manual olarak yedeklenmesi gerekir. SQL Server 2005′te sistem veritabanlarının nasıl yedeklenecekleri MSDN’de anlatılmaktadır.
Son olarak ÅŸunu söyleyebiliriz, sistem tabloları database programlarının sürümlerine baÄŸlı olarak deÄŸiÅŸkenlik arzettikleri ve kullanıcı tarafından manual deÄŸiÅŸtirilebilme ihtimalleri için bunların yerine konunun başında bahsettiÄŸimiz metadata viewlerinin kullanılması daha saÄŸlıklı olur. Bununla birlikte SQL Server 2005′te sistem metadatasıyla ilgili hem bahsi geçen eksiklikler kaldırılmış hem de yeni yaklaşımlar sunulmaktadır. ÖrneÄŸin daha önce programcı servis tablolarını kolaylıkla deÄŸiÅŸtirebiliyordu fakat SQL Server 2005′te bunu yapması çok zor. Ayrıca daha önce kullanıcı bu tablolar aracılığıyla yetkili olmadığı nesneleri de görebilmekteydi. 2005 sürümünde metadata sorgulama için bir güvenlik katmanı oluÅŸturulmuÅŸ böylece kullanıcı sadece yetkili olduÄŸu nesneleri görebilmektedir.Dolayısıyla SQL Server 2005 için sys ÅŸemasına baÄŸlı görüntülerin kullanılması daha iÅŸlevsel ve daha fazla bilgi saÄŸlayıcı olacaktır.
Konuyla ilgili query örneklerinin bulunduğu linkteki MSDN makalesinin faydalı olacağına inanıyorum.




Mayıs 29th, 2007 at 13:03
acilllllllll yardım
bilgisayar programcısıyım ödevim master database de sys tablolarının açıklaması 10 tane tablonun açıklaması ne işe yaradığı bana yardımcı olurmusunuz ödev teslim 31 mayıs son lütfen başarılarınızın devamını dilerim
Mayıs 30th, 2007 at 14:36
Merhaba,
SQL 2000′deki master database’in altındaki sys tabloları, database sunucusunun konfigurasyon bilgilerini ve veritabanı üzerindeki nesneler(table, view, user …) hakkında bilgi tutmaya yarar. ÖrneÄŸin sysservers tablosu sunucu üzerindeki linked server tanımlamalarını, sysusers tablosu veritabanı üzerinde tanımlı kullanıcıları, sysdatabases tablosu, sunucu üzerinde tanımlı databaseleri, sysprocesses tablosu, o anda sunucu üzerinde oturum açmış kullanıcı bilgilerini bildirir.
Bütün sistem nesnelerine aşağıdaki query ile erişebilirsiniz;
SELECT name FROM master..sysobjects WHERE name LIKE 'sys%'Ekim 19th, 2007 at 10:56
Merhabalar bende sunu merak ediyorum database senkronizasyonu için program yazmaya çalışıcama ama sql’i daha ilk defa kullanmış olucam kısmetse.BU sysobjects tam olarak ne iÅŸe ayrıo onu anlamadım ki ayrıca benim projemde database senkronizasyonu olucagı için nasıl bu database’leri bir birleri ile aynı yapıya getiemem gerektiÄŸini merak ediyorum yani ilk veri tabanı ile ikinci veri tabanı bir birinin aynısı olucaklar
Ekim 19th, 2007 at 15:25
Sayın Er,
sysobjects tablosu, SQL Server’a ait sistem tablosu olup bir bulunduÄŸu database’deki table, view, rule, stored procedure, default ve trigger nesnelerinin tanımlarını içerir.
“İki database birbirinin aynısı olacak” derken sanırım hem ÅŸema yapısı yani içerdikleri nesneler aynı olacak hem de tablo içindeki datalar aynı olacak demek istiyorsunuz. Bu konuyu DTS’ler aracılığıyla data export/import yapısıyla yapabileceÄŸiniz gibi replikasyon yöntemiyle de yapabilirsiniz. Fakat SQL Server’a yeni baÅŸlamış biri olarak direk bu konudan baÅŸlamanız sizi yorabilir. Konuyla ilgili olarak “SQL Server Database Mirroring” veya “SQL Server Replication” teknolojilerini incelemenizi tavsiye ederim.
Ekim 24th, 2007 at 17:02
senkronızasyondan kastım sadece yapısal olarak bır bırnın aynı olan ıkı database yaartmaya calısırum yanı ıcndekı datalara herahangı bı mudahalem olmayacak fakat bunu yaparken stored proedure ve view kısımlarınında nasıl kaynak databaseden hedef database ile kıyaslanıp sonrasında guncelleme yapılacagını bılmıorum bana bu konuda yardımcı olursanız sevınırım.
Ekim 25th, 2007 at 08:50
Bunu en basit ÅŸekilde Data Import/Export aracılığıyla yapabilirsiniz. Üzerinde çalıştığınız database’i saÄŸ tıklayıp “All Tasks » Import Data” menüsünü tıklayınız.
Kolay gelsin,
Ekim 27th, 2007 at 17:00
Iyi gunler,
Ben iki veritabanı arasında senkronizasyon yapmaya yarayan bir uygulama yazmaya calişıyorum. Askın Er’in sordugu “sadece yapısal olarak bırbırnın aynı olan ıkı database yaratmaya calısıyorum yanı ıcndekı datalara herahangı bı mudahalem olmayacak fakat bunu yaparken stored proedure ve view kısımlarınında nasıl kaynak databaseden hedef database ile kıyaslanıp sonrasında guncelleme yapılacagını bılmıorum bana bu konuda yardımcı olursanız sevınırım.” kısmını siz anlatmışsınız fakat bunu benim kodla yapmam lazım. Bana bu konuda fikir verebilirseniz sevinirim.
Ilginiz icin tesekkur ederim.
Ekim 29th, 2007 at 18:02
İki database’in karşılaÅŸtırılması için birçok yöntem kullanılabilir. DoÄŸrudan SQL Server içindeki araçlar kullanılabildiÄŸi gibi MS Datadude, Swis Sql veya RedGate Sql Compare gibi third party uygulamalar da kullanılabilir. Bu iÅŸlemi kendi yazacağınız bir program vasıtasıyla yapmanız için iki yöntem tavsiye ederim;
SMO ile ilgili detayları bu linkte bulabilirsiniz.
Aklıma gelen başka bir yöntem olarak sp_helptext procedure kullanılabilir. sp_helptext procedure, view, stored procedure, function gibi nesnelerin script kodlarını döndürür.
Eylül 28th, 2008 at 13:15
Selam benim öğrenmek istediğim iki database arasinda table aktarimi nasil yapabileceğim neredeyse birbirinin ayni iki db sadece aralarinda farklı olan bir iki table i bir diğerine aktarmam gerek bu konuda nasıl bir yol izlemem gerektiği hakkında bilgi verirseniz sevinirim
Ekim 3rd, 2008 at 03:56
Bu işin en kolay en pratik yöntemi SQL Server içerisindeki Import/Export işlemini kullanmanızdır. Bu işlemde kaynak ve hedef veritabanlarını seçerek ilgili aktarımları kolayca yapabilirsiniz.
Mayıs 25th, 2009 at 16:07
selamlar sql üzerindeki iki farklı serverdeki aynı databasedeki aynı bir tabloyo şemasal olarak nasıl comparison edebilirim
Saygılar
Kolay Gelsin.
Mayıs 26th, 2009 at 08:00
Uzaktaki sunucunun adı SERVER2, karşılaştırılacak tablo adının TB ve bu tablonun DB isimli veritabanı altında olduğunu düşünelim.
Öncelikle yereldeki tablonun kolon listesi alınıp #T1 tablosuna aktarılır.
SELECT COLUMN_NAME INTO #T1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’Butce’
Aynı şekilde uzaktaki sunucu için de kolon listesi alınır.
SELECT * INTO #T2 FROM OPENQUERY
(SERVER2,’SELECT COLUMN_NAME FROM DB.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=”TB”’)
Ardından #T1 ile #T2 tabloları JOIN edilerek iki tablo arasındaki fark çıkarılır.
Mayıs 26th, 2009 at 11:23
Hocam sağolun peki bu farkın sql scriptini çıkarmak ıcın nasıl bır yol ızlemek gerekır.bu scrıpt calıstırılarak uzaktakı tablonun localdakı tabloyla aynı sema halıne getırılmesı gerkıyor.
Mayıs 28th, 2009 at 08:17
Bu script’i burada yazmak zaman alacaktır. EÄŸer bir kereliÄŸine yapacaksan sqldbtools.com’un SQLDBDiff veya AdeptSQL Diff araçlarını kullanabilirsin. Mutlaka kendim yapmak istiyorsan ÅŸu ÅŸekilde yönlendirme yapabilirim.
Önceki mesajda bahsettiÄŸim gibi #T1 ve #T2 kolonlarını Join edip yereldeki tabloda olup uzaktaki tabloda olmayan kolonlar listelenir. INFORMATION_SCHEMA.COLUMNS isiml view’deki COLUMN_NAME, kolon adını, DATA_TYPE kolonu o kolonun veri tipini, diÄŸer kolonlar da veri uzunluÄŸu varsa üzerinde NULL izni gibi bilger içermektedir. Burada hangi kolonlara ihtiyacınız varsa onları alıp ona göre bir T-SQL Script’i oluÅŸturmanız gerekiyor. Her kolon için ALTER UzaktakiTablo ADD BuradakiKolonAdi . . . seklinde cumleler olusturup en sonda sp_executesql ile bu cümlerleri çalıştırmanız yeterli olacaktır. Adını veriÄŸim toollar bunun scriptini oluÅŸturmaktadır.
Kolay gelsin
Ekim 14th, 2009 at 12:42
Hocam Merhaba Yine bir sorum olacak,
Diskimde tutulan sql uzantılı dosyanın sadece yolunu gosterek run edebileceğim bir yontem varmı
sql dızınınde bulunan com dızını altında tablediff gıbı yardımcı araclar mevcutmu ?
Kolay Gelsin
Teşekkürler
Ekim 22nd, 2009 at 09:45
Doğrudan Query Analyzer içerisinde bunu yapabilecek bir yordam bulunmamaktadır Murat. Fakat ISql, OSql veya SqlCmd gibi araçlar kullanılarak herhangi bir konumdaki dosya çalıştırılabilir.
osql -Usa -PSifre -i c:\dosya.sql
Kasım 7th, 2009 at 22:02
paradoxta oluşturulmuş(md) database içinde bulunan resimleri ilave veya değiştirme nasıl yapabilirim.
teÅŸekkür ederim…