Keresés

Részletes keresés

NevemTeve Creative Commons License 2014.09.18 0 0 7
NevemTeve Creative Commons License 2010.10.05 0 0 6
NevemTeve Creative Commons License 2010.10.04 0 0 5
lszb Creative Commons License 2002.01.13 0 0 4
Ok. Kösz a segítséget.
Előzmény: facsega (3)
facsega Creative Commons License 2002.01.09 0 0 3
Igazad van, az ugy tenyleg rossz (nem teszteltem). Az alabbiakat viszont kiprobaltam, igy mar tuti jo:
create trigger gen_strid on proba for insert as
declare @strid varchar(10)
select @strid = (select top 1 convert(varchar(10),i.id) from inserted i)
print @strid

A top 1 csak azert kellett, hogy ne szalljon ki hibaval, ha tobb sort szursz be egyszerre (komplett tabla bemasolas esete), egyebkent nincs sok ertelme. Ha tobb sor beszurasat is ki akarnam iratni, akkor pl. CURSOR-t lehet hasznalni:
alter trigger gen_strid on proba for insert as
declare @strid varchar(10)
declare c_sid cursor for
select convert(varchar(10),i.id) from inserted i
for read only
open c_sid
fetch next from c_sid into @strid
while (@@fetch_status = 0)
begin
print @strid
fetch next from c_sid into @strid
end
close c_sid
deallocate c_sid

Ne ebben sem volt JOIN :)

Kulonben meg semmi gond.

Előzmény: lszb (2)
lszb Creative Commons License 2002.01.09 0 0 2
Szia Facsega
Bocs, hogy nem válaszoltam, csak
kaptam egy vírust (igazit :)
Köszönöm a kimerítő válaszodat.
Most már világos.
Az első triggernél kimaradt egy
from inserted i, ugye?
Előzmény: facsega (0)
facsega Creative Commons License 2002.01.08 0 0 1
kössz...
Előzmény: facsega (0)
facsega Creative Commons License 2002.01.05 0 0 0
hogy megkapjam a törlendő sorokat?
Gondolom itt azt akartad irni, hogy beszurt sorokat.
Csak abban az esetben kell osszekapcsolni az alaptablaval az INSERTED tablat, ha az alaptablat modositani akarod a triggerben.

Legyen pl. a proba tabla:
create table proba (
id int not null primary key,
strid varchar(10) null
)

Az elso triggerben irassuk ki a beszurt id erteket, ehhez nem kell semmifele join:
create trigger pr_strid on proba for insert as
declare @strid varchar(10)
select @strid = convert(varchar(10),i.id)
print @strid

A masodik triggerben irjuk be az id-t a strid mezobe. 1. valtozat:
create trigger gen_strid on proba for insert as
update inserted i set strid = convert(varchar(10),i.id)

Ne ez igy nem fog mukodni, az alabbi uzenetet kapod, mikor a triggert be akarod irni:
The logical tables INSERTED and DELETED cannot be updated. Az INSERTED tabla csak egy logikai tabla (egy cache a memoriaban), ami nem modosithato.

A 2. megoldas mar mukodni fog:
create trigger gen_strid on proba for insert as
update p set strid = convert(varchar(10), i.id)
from proba p inner join inserted i on i.id = p.id

Ahhoz, hogy az alaptablaban megkeresd a beszurt sort, ossze kell kapcsolni az INSERTED-el.

A 3. megoldasban nincs join:
create trigger gen_strid on proba for insert as
update p set strid = convert(varchar(10), p.id)
from proba p where p.id = (select id from inserted)

viszont csak egy soros beszurasra fog mukodni, mivel a WHERE-ben a p.id-t csak egy ertekkel hasonlithatom ossze, tehat a zaroljelben levo SELECT csak egy sort szabad, hogy visszaadjon.

A fentiekbol kovetkezik, hogy triggerek hasznalata eseten mindenkeppen jo ha van elsodleges kulcsa a tablanak.

Előzmény: lszb (-)
lszb Creative Commons License 2002.01.03 0 0 topiknyitó
Meg tudja valaki mondani, hogyha mondjuk írok egy insert triggert, akkor mért kell összekapcsolni az ideiglenesen létrejövő INSERTED táblát az alaptáblával, hogy megkapjam a törlendő sorokat?

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!