[ boris.sql @ 17.09.2010. 09:25 ] @
Pomoc,
kako napraviti After Update/Instert trigger na tablele koje sadrze tip podataka text, ntext, image?
Ako tabela izmedju ostalih kolona sadrzi i kolonu tipa npr. image onda se ne mogu povuci podaci iz INSERTED ili DELETED, kako da napravim univerzalni trigger koji ce mi vratiti podatke iz INSERTED-a ili DELETED-a, tj sve one podatke koji nisu tipa image, podaci ovog tipa neka budu zanemareni!
Ovakav trigger nije problem napraviti manuelno za jednu tabelu, ali je za mene komplikovano napraviti ga da bude univerzalan, tj da ga mogu primijeniti na bazu podataka koja ima 300 tabela, a da ne pravim za svaku tabelu posebno!
HVALA PUNO!!!
[ stevs986 @ 17.09.2010. 11:17 ] @


Napravis proceduru koja za prosledjenu tabelu dinamicki kreira trigger sa tim tvojim kriterijumima.

Posle samo pustis kroz kursor recimo poziv procedure za sve tabele. To ti je jedna od ideja...
[ boris.sql @ 17.09.2010. 12:11 ] @
Hvala Sladjane, ali nemam toliko znanja da to uradim!
[ Zidar @ 17.09.2010. 14:33 ] @
Ako tvoja baza ima preko 300 tabela i svaka ima image i text fields, onda bi tvoj problem mogao biti mnogo veci nego sto izgleda. Iz ovoga sledi da pokusaj sa trigerima ne bi bio resenje za problem. Deluje mi da nesto drugo ne valja, i to naveliko.

Nadam se da gresim.

[ boris.sql @ 17.09.2010. 14:56 ] @
Tabela se pravi sa ciljem da se lakse provjeri koje se sve tabele u bazi insertovane ili updateovane nakon neke akcije. Nemaju sve tabeke 'image' tipove podataka ali neke imaju i automatski trigger After UPDATE/INSERT u kombinaciji sa tabelama INSERTED i UPDATED ne pije vode! Trigger INSTEAD OF mi takodje ne pomaze u ovom slucaju, i ako radi korektno sa navedenim (INSERTED/UPDATED) tabelama! Mislio sam da ima neki jednostavniji nacin da rijesim ovaj problem, ali ako ne postoji onda cu morati rucno praviti triggere za svaku tabelu koja ima sporne tipove podataka! HVALA ZA POMOC I SUGESTIJE!
[ stevs986 @ 17.09.2010. 15:42 ] @
Evo jos malo pomoci nemam vremena da ti odradim sve. Kod je iz glave, mozda ima gresaka.

Napravis proceduru kojoj ces proslediti ime tabele. Unutar procedure imas nesto ovako.

Code:

DECLARE 
@column     nvarchar(256),
@columns nvarchar(2000)

SET @columns = ''

DECLARE C CURSOR FOR
    SELECT COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'PROSLEDJENA TABELA' 
    AND DATA_TYPE <> 'image'
    
OPEN C

    FETCH NEXT FROM C INTO @column
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @columns = @columns + ', ' + @column
        FETCH NEXT FROM C INTO @column
    END
    
CLOSE C
DEALLOCATE C

Na taj nacin si izvukao imena svih kolona koja nisu tipa image iz konkretne tabele.

Sada te nista ne sprecava da iskucas triger koji inace pravis za jednu tabelu na ovaj nacin
Code:


@ssql = ' skript za triger s tim sto koristis promenljivu @columns za kolone i naravno prosledjenu tabelu'

sa 

EXEC sp_executesql @ssql

izvrsis skript i eto trigera




Poslednja stvar koja ti ostaje je opet kursor za sve tabele



Code:

DECLARE 
@tb_name     nvarchar(256)

DECLARE CX CURSOR FOR

        /*Ovako uzimas sve tabele iz baze*/
    SELECT name FROM sysobjects WHERE type= 'U'
    
OPEN CX

    FETCH NEXT FROM CX INTO @tb_name
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        EXEC ime_procedure_koju_si_napravio @tb_name

        FETCH NEXT FROM CX INTO @tb_name
    END
    
CLOSE CX
DEALLOCATE CX



Ovo ti je sustina price, razradi malo ideju i bice ti lakse.
Nista te ne sprecava da odradis i prvo DROP pa CREATE trigera.
Na taj nacin mozes nesto i da izmenis, doradis i za minut dva imas prepravljene trigere na svim tabelama.
Zamisli da moras rucno da menjas trigere za 300 tabela koje si pre toga rucno pisao.

[ boris.sql @ 17.09.2010. 17:09 ] @
stevs986 hvala puno!
Mislim da ce mi ovo skratiti pola muke...
God bless you!
[ stevs986 @ 18.09.2010. 10:54 ] @


Nema problema... ;)