Avatar billede stig3 Mester
08. august 2001 - 15:05 Der er 25 kommentarer og
1 løsning

Stored procedure - trigger

Det er sikkert nemt, men jeg kender intet til triggers og sp.

Jeg har en tabel eksempelvis:

tabel_gl
----------
fornavn
efternavn
tlf
Email

tabel_ny
-----------
Navn        (dvs: fornavn+\' \'+efternavn)
tlf
Email

Den skal trigges, hver gang der opdateres i tabel_gl

Hvordan gør man det ???
Det er MSSQL6.5 :-(
Avatar billede netsrac Praktikant
08. august 2001 - 15:09 #1
Du laver vel bare et view istedet:

CREATE VIEW AS (SELECT fornavn + \' \' + efternavn AS navn, tlf, email from tabel_gl)
Avatar billede netsrac Praktikant
08. august 2001 - 15:09 #2
CREATE VIEW tabel_ny AS (SELECT fornavn + \' \' + efternavn AS navn, tlf, email from tabel_gl)
Avatar billede stig3 Mester
08. august 2001 - 15:10 #3
nej for jeg skal \"skrive\" til mere end een tabel, og jeg har lige erfaret at hvis man laver et view med join i kan man ikke opdatere det.

Logisk egentlig, men det var jeg ikke lige klar over.
Avatar billede stig3 Mester
08. august 2001 - 15:12 #4
og når du sammensætter fornavn+\' \'+efternavn bliver den vist også \"uopdaterbar\"
Avatar billede netsrac Praktikant
08. august 2001 - 15:12 #5
Hm...
Avatar billede stig3 Mester
08. august 2001 - 15:14 #6
men hvis du har en metode, hvor jeg undgår to tabeller og kan bruge de data jeg allerede har liggende er jeg mere end lydhør.

Jeg tror nu at en sp trigget ved opdater er den eneste mulighed....................

Og hvordan gør man nu liiiige det ?
Avatar billede slash Nybegynder
08. august 2001 - 15:16 #7
et utestet opkast mæ en trigger:


create trigger smeltdatasammen on dbo.tabel_gl
for insert
as

declare @fnavn varchar(100)
declare @enavn varchar(100)
declare @tlf int
declare @mail varchar(100)
declare @navn varchar(200)

select @fnavn=fornavn, @enavn=efternavn, @tlf=tlf, @mail=email from inserted

select @navn = @fnavn + \' \' + @enavn

insert into tabel_ny (navn, tlf, email) values (@navn, @tlf, @mail)
Avatar billede netsrac Praktikant
08. august 2001 - 15:16 #8
Jeg ved desværre ikke noget om hvordan man bruger triggers, men man kan vel danne en ny tabel hvis et view ikke kan bruges:

CREATE TABLE tabel_ny AS (SELECT fornavn + \' \' + efternavn AS navn, tlf, email from tabel_gl)
Avatar billede tmceu Praktikant
08. august 2001 - 15:17 #9
CREATE TRIGGER [navn] ON [TABEL] FOR INSERT AS

DECLARE @variabel1 varchar(10)
DECLARE @variabel2 char(1)

DECLARE [navn]_cursor SCROLL CURSOR
FOR select * FROM inserted

OPEN [navn]_cursor

FETCH First FROM [navn]_cursor INTO @variabel1, @variabel2.....
if (@@FETCH_STATUS <> -1) /* do I have a record */
BEGIN

END

FETCH Next FROM [navn]_cursor INTO @variabel1, @variabel2.....
END

CLOSE [navn]_cursor
DEALLOCATE [navn]_cursor

Ovenstående er et lille eksempel, sig til hvis du skal have forklaring til det.
Avatar billede tmceu Praktikant
08. august 2001 - 15:19 #10
CREATE TRIGGER [navn] ON [TABEL] FOR INSERT AS

DECLARE @variabel1 varchar(10)
DECLARE @variabel2 char(1)

DECLARE [navn]_cursor SCROLL CURSOR
FOR select * FROM inserted

OPEN [navn]_cursor

FETCH First FROM [navn]_cursor INTO @variabel1, @variabel2.....
if (@@FETCH_STATUS <> -1) /* do I have a record */
BEGIN
-- den kode du vil lave for hver record
END

FETCH Next FROM [navn]_cursor INTO @variabel1, @variabel2.....
END

CLOSE [navn]_cursor
DEALLOCATE [navn]_cursor
Avatar billede stig3 Mester
08. august 2001 - 15:20 #11
slash>>

Det ser fornuftigt ud

Er det samme procedure med update ?

bare:
create trigger smeltdatasammen on dbo.tabel_gl
for insert
as

declare @fnavn varchar(100)
declare @enavn varchar(100)
declare @tlf int
declare @mail varchar(100)
declare @navn varchar(200)

select @fnavn=fornavn, @enavn=efternavn, @tlf=tlf, @mail=email from inserted

select @navn = @fnavn + \' \' + @enavn

updateSQL..........
Avatar billede stig3 Mester
08. august 2001 - 15:21 #12
hov:

for update
Avatar billede slash Nybegynder
08. august 2001 - 15:21 #13
der skal du have update med - som vist her:

create trigger smeltdatasammen on dbo.tabel_gl
for insert, UPDATE, DELETE
as



Avatar billede slash Nybegynder
08. august 2001 - 15:23 #14
stig3 >> hvis sql-server books online ellers findes til 6.5 så vil jeg anbefale at du læser lidt i den - læs evt. i sql server books online til 7.0... der står en masse gods ang. triggers
Avatar billede slash Nybegynder
08. august 2001 - 15:24 #15
bare så du får lidt mere overblik over triggers - hvis det ender op med at du anvender det!
Avatar billede stig3 Mester
08. august 2001 - 15:26 #16
Jeg har vist hvad jeg skal bruge.

Jeg vender tilbage med uddeling af pts., når jeg har fået testet hvad der virker..........
Avatar billede torbenkoch Nybegynder
08. august 2001 - 22:02 #17
Uha - en cursor i en trigger - uha - kan kun anbefale at lade være - det er DYYYYRT i performance.

Kan godt overveje, hvordan man laver den uden cursor hvis det skulle have interesse??
Avatar billede stig3 Mester
10. august 2001 - 13:32 #18
Hvor skal jeg sætte den ind henne ?

Under stored procedures ?

Der er ikke mulighed for at lægge den under triggers. Det er der ikke noget der hedder.

Der er:
- Views
- Stored procedures (jeg går ud fra at det er her den skal ind?)
- Rules
- default
Avatar billede slash Nybegynder
10. august 2001 - 13:38 #19
Jow - triggermenupunktet findes.

åbn enterprise manageren. Vælg db\'en hvor triggeren skal være. Vælg den tabel hvor triggeren skal udføre arbejdet på, altså den tabel hvor du insert i 1. gang. Højreklik på tabellen. Vælg all tasks. Vælg manage triggers. og vupti du kan lave en ny trigger
Avatar billede stig3 Mester
10. august 2001 - 13:44 #20
nåååhr sån\'
Avatar billede slash Nybegynder
10. august 2001 - 13:46 #21
jæppe li jæp :-(=)
Avatar billede tmceu Praktikant
11. august 2001 - 15:49 #22
torbenkoch >> jeg tror han allerede er i gang med slash\'s eksempel uden cursor. Men slap lige lidt af, så er det heller ikke værre med performance. Jeg synes nogle gange der bliver malet alt for mange sort/hvide billeder herinde. Der er som regel en sandhed midt i mellem :-)
Avatar billede torbenkoch Nybegynder
12. august 2001 - 19:30 #23
tmceu: Du har da ret, men der er jo ingen skade i at gøre opmærksom på det.

Skal databasen kun supportere nogle få brugere, så er det jo ikke noget problem, men er der tale om mange brugere, giver en langsom trigger nogle (relativt) lange låsningstider, som så går ud over performance.

Så din sandhed midt imellem må være, at det er ok, hvis der er relativt...) få brugere ;-)

Avatar billede stig3 Mester
15. august 2001 - 08:44 #24
Hvis man nu vil lave 3 triggers for samme tabel (insert, update, delete). Skriver man så det hele i den samme trigger eller lave man 3 seperate ?
Avatar billede stig3 Mester
15. august 2001 - 10:39 #25
Nu virker indsert, så formålet med dette spørgsmål er opfyldt.

Den endelige kode blev:
create trigger indsaet_person on Medarbejdere
for insert
as
CREATE TRIGGER indsaet_person ON dbo.Medarbejdere
FOR INSERT
AS

declare @fnavn varchar(30)
declare @mnavn varchar(30)
declare @enavn varchar(30)
declare @Initialer varchar(15)
declare @stillingbetegn varchar(50)
declare @Lokal varchar(8)
declare @Stikord varchar(255)
declare @email varchar(50)
declare @navn varchar(200)


select @fnavn=fornavn, @mnavn=mellemnavn, @enavn=efternavn, @stillingbetegn=Titel, @Lokal=telefon_nummer, @initialer=initialer, @stikord=CONVERT(varchar(255), beskrivelse) from inserted

select @email = @initialer + \'@arf.dk\'
select @navn = @fnavn + \' \' + @mnavn + \' \' + @enavn

insert into person (navn, initialer, stillingbetegn, lokal, stikord, email, kalendersync) values (@navn, @initialer, @stillingbetegn, @lokal, @stikord, @email, 1)


På falderebet.....
Skal man lave 3 triggers hvis man vil lave for delete, update og insert eller skriver man det hele i een trigger ?
Avatar billede torbenkoch Nybegynder
15. august 2001 - 12:35 #26
stig3:

Om man laver 1, 2, eller 3 triggers afhænger meget af, hvor forskellige de er. Det står en helt frit for at kombinere UPDATE, INSERT og DELETE triggers, men logisk vil man nok typisk vælge at kombinere (hvis man altså kombinerer dem) UPDATE og INSERT og holde DELETE for sig selv.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester