pirmdiena, 2010. gada 13. decembris

OCV lai iegūtu DB objekta izveides skriptu

Rakstā īsi aprakstīti divi OCV (Object Catalog Views) skati- sys.objects un sys.sql_modules. Šo abu skatu kombināciju var izmantot lai iegūtu procedūru, skatu, ... izveides skriptus.

Manā gadījumā bija nepieciešams atrast, kur datu bāzes objektos ir izmantota konkrēta frāze.

sys.objects- var izmantot lai iegūtu datu bāzes objektus (izņemot DML trigerus), to izveides un mainīšanas datumus un citu informāciju. Tātad- ja vēlaties uzzināt kuri objekti mainīti pēdējā mēneša laikā, šis ir īstais skats, kurā meklēt attiecīgo informāciju!
sys.sql_modules-  var izmantot, lai iegūtu procedūru, skatu, triger, ... izveides skriptus (gadījumā, ja objekts ir izveidots šifrēts, tad "definition" būs vērtība Null).

Tas, kā šos skatus izmantoju:
select o.name, definition
from sys.sql_modules c
join sys.objects o
on c.object_id = o.object_id
where definition like '%MeklējamāFrāze%'
Bet ja būtu vajadzīgs iegūt izveides skriptu, rīkotos apmēram šādi:
declare @txt nvarchar(max)
select @txt = definition
from sys.sql_modules c
join sys.objects o
on c.object_id = o.object_id
where name = 'ObjektaNosaukums'
Print @txt
Iepriekšējo var ielikt iekš kursora, pielikt vēl "Go" pa vidu un noskriptēt vajadzīgos objektus:
declare @txt nvarchar(max)
declare cur cursor for
    select definition
    from sys.sql_modules c join sys.objects o
        on c.object_id = o.object_id
    where definition like '%Frāze%'

open cur
fetch next from cur into @txt
while @@fetch_status = 0
Begin
    print @txt
    print 'Go'
    print ''
    fetch next from cur into @txt
End

close cur
deallocate cur
Print komanda izvada tekstu, kas nav garāks par 4000 simboliem (ja nvarchar, kā šajā gadījumā). Tātad- ja procedūras teksts būs garāks, tad tā tiks izvadīta tikai daļēji- Print komandas teksta garuma ierobežojums.

2 komentāri:

  1. Un uzreiz neliela piepilde- var izmantot arī funkciju sp_helptext! Bet rakstā aprakstītais patīk labāk :).

    AtbildētDzēst
  2. Paldies, par rakstu. Es parasti taisu datu bāzes pilno skriptu un tad vajadzīgo meklēju tajā. Šādi ir viennozīmīgi elegantāk un ērtāk.

    AtbildētDzēst