İliskili tablolar ve foreign key alanlarını öğrenme

İliskili tablolar ve foreign key alanlarını öğrenme:

select object_name(fkeyid) as fkey_table,
col_name(fkeyid,fkey) as columname
, object_name(rkeyid) pkey_table
, col_name(rkeyid,rkey) reference_columnname
from sysforeignkeys

where object_name(fkeyid)='tablom'

Stored Procedurelerin,Triggerların, Constraintlerin, Viewlerin içeriğini görme

Sistemlerimizde kullandığınız onlarca hatta belki yüzlerce stored procedureler, viewler, triggerlar, constraintler vardır. Bir çoğunun ismi bile aklımızda değildir. Hangisinde hangi işlemin yapıldığını da ya da o nesne içinde yapılan işlemin detaylarını da unuturuz çoğu zaman.

Günün birinde de şuna benzer bir ihtiyacınız eminim olmuştur.
Bir satış tablonuz var ve arkasında da bir çok trigger. Bir triggerın yaptığı işlem kalkmış diğer bir triggeri o da başka birini tetiklemiş. Bunlardan biri de stoktan ürünün satıldığı kadarını düşmüş. Ama bunu hangisinin içinde yapmış diye tespit etmeniz gerekti.

Tek tek triggerları arayarak bulurum diyorsanız bu da bir çözümdür ama daha kolay bir yolu var desem üstelik tek tek trigger içeriğini incelemekten çooooook daha kolay.


Bu gibi durumlarda imdadımıza syscomments tablosu yetişiyor.


Nasıl mı?

select object_name(id),text from syscommentswhere text like '%update stoktablosu%' and text like '%set miktar = miktar - 1%'

***object_name fonksiyonu, id si verilen veritabanı nesnesinin adını döndürür.

syscomments tablosu, Ms-SqlServer'daki her bir view, rule, default, trigger, CHECK constraint, DEFAULT constraint ve stored procedure 'u içeriğiyle birlikte tutar.

syscomments tablosunun yapısını incelediğinizde bir çok kolonu olduğunu görürsünüz. Bunlardan text kolonu vt nesnesinin içeriğini ifade eder. Max 4 MB sınırlıdır. Dolayısıyla örneğin nesnenizin içeriği 4 mb dan fazla ise yeni bir satır kayıt daha yine bu tabloda yer alır, ilk satırda colid 1 iken nesnenin ikinci 4 mb lık kısmı için 2, üçüncü 4 mb lik yeri içinse colid 3 olur ve böyle gider.

Problem: İçerisinde Tb_Jobdeneme tablosuna insert işlemi yapılan tüm veritabanı nesneleri neler diye mi merak ediyorsunuz?

Çözüm:
select * from syscommentswhere text like '%insert into Tb_Jobdeneme %'




MSSQL Server Jobları Hakkında Bilgi Edinme

MsSQL Server 'da çalışan joblarla ilgili bilgi veren stored procedure'ler olduğunu biliyor muydunuz?
Bu procedureler sp_help_job ve xp_sqlagent_enum_jobs olarak iki tane.

sp_help_job : Bu proceure çalıştırılınca joblarla ilgili bilgileri görebiliyorsunuz ancak bu procedure'un çıktısını herhangi bir tabloya insert edemiyorsunuz çünkü engellenmiş:)

Kullanımı oldukça basit:

  • Şu anda çalışır durumdaki joblar için:
    exec msdb.dbo.sp_help_job @execution_status = 1
  • Tüm joblarla ilgili görüntülemek için:
    exec msdb.dbo.sp_help_job
  • Adını belirttiğiniz jobla ilgili bilgiler için:
    exec msdb.dbo.sp_help_job @job_name = 'JobAdi'

  • xp_sqlagent_enum_jobs :Bu proceure çalıştırılınca joblarla ilgili bilgileri görebiliyorsunuz ve dönen result seti de bir tabloya insert edebiliyorsunuz.

    CREATE TABLE #JobBilgileri
    (
    JobID UNIQUEIDENTIFIER NOT NULL
    , LastRunDAte INT not null
    , LastRunTime INT not null
    , NextRunDate INT not null
    , NextRunTime INT not null
    , NextRunScheduleID INT not null
    , RequestedToRun INT not null
    , RequestSource INT not null
    , RequestSourceID varchar(100)
    , Running INT not null
    , CurrentStep INT not null
    , CurrentRetryAttempt INT not null
    , JobState INT not null
    )

    insert into #JobBilgileri
    exec master.dbo.xp_sqlagent_enum_jobs 1, JobSahibininAdi

  • Tüm job bilgileri için:
    select j.* from #JobBilgileri j

  • Şu anda çalışan joblar için:
    select s.name,j.* from #JobBilgileri j
    inner join msdb.dbo.sysjobs s on s.job_id = j.JobID
    where j.running = 1

  • Şu anda çalışmayan joblar için:
    select s.name,j.* from #JobBilgileri j
    inner join msdb.dbo.sysjobs s on s.job_id = j.JobID
    where j.running = 0
  • Ayın İlk Günü ve Son Gününü Bulma

    Kaçıncı ay olduğu ve hangi yıl için hesaplanacağı parametre olarak gönderilen ve bu değerler için o ayın ilk ve son gününü hesaplayan bir Stored Procedeure yazmak istersek:

    CREATE Proc sp_AyinIlkSonGunu
    @Yil int,
    @Ay int
    as
    declare @SonrakiAy int
    if @Ay<>12
    set @SonrakiAy=@Ay+1
    else
    set @SonrakiAy=1
    select convert(datetime, convert(char(4),@Yil)+right('0'+convert(varchar,@Ay),2)+'01')IlkGun
    ,dateadd(d,-1,convert(datetime,convert(char(4),@Yil)+right('0'+convert(varchar,@SonrakiAy),2)+'01'))SonGun



    Peki bu prosedürü nasıl çalıştıracağız?

    EXEC sp_AyinIlkSonGunu 2007,9

    Tarih bilgisini bileşenlerine ayırma

    select getdate()Tarih,datepart(year,getdate())yil, datepart(month,getdate())ay
    , datepart(day,getdate())gun, datepart(hour,getdate())saat
    , datepart(minute,getdate())dakika, datepart(second,getdate())saniye
    , datepart(millisecond,getdate())milisaniye

    Çıktısı:





    .

    top