Originariamente inviato da nman
Anchio sono daccordo con JoeTaras
Non userei un Trigger per quello scopo
Io tendo ad usare il DB solo per memorizzare i dati
tutto il resto dell'"intelligenza" va nella applicazione.
Tu avrai una applicazione che prepara un record per registrarlo nel DB.
In quel momento ancora non conosci l' ID perche ti viene assegnato
solo dopo la registrazione.
Pero forse ( non so che applicazione sia ) puoi memorizzarti alcuni
campi "rilevanti" del record da registrare
in modo che DOPO la registrazione lanci una query sul DB
mettendo nella WHERE i campi rilevanti prememorizzati
pertanto ti RITORNA il tuo ID corretto nella applicazione.
Adesso hai tutto l'occorrente per registrare anche su altre tabelle
lo stesso record
__________________________________________________ _____________________
Se invece lo vuoi fare con i Trigger prova " per cultura "
a lanciare ( SQL2008R2 ) lo scripr sotto.
che anch'io uso quando voglio riacculturarmi
i commenti sono nello stesso script.
codice:
/*
Questo è un mimiesempio di trigger
soggetto sicuramente a miglioramenti
*/
-- Inizio a creare un nuovo DB
CREATE DATABASE Trig;
GO
-- Uso il DB appena creato
USE Trig;
GO
-- Creo una tabella ( Ordini (Or) )
CREATE TABLE [dbo].[Or]
(
[OrId] [int] IDENTITY(1,1) PRIMARY KEY, -- La Key di tabella
[OrFor] [nvarchar](50) NULL, -- Un fornitore a cui si fa un ordine
);
GO
-- Creo una altra tabella ( Specchio (Sp))
-- qui registro TRAMITE TRIGGER gli eventi di "Or"
CREATE TABLE [dbo].[Sp]
(
[SpId] [int] IDENTITY(1,1) PRIMARY KEY, -- La Key di tabella
[OrKe] [int], -- La KeyEsterna alla Tabella Or
[Forn] [nvarchar](50) NULL, -- Il nome del fornitore della tabella Or
[Note] [nvarchar](50) NULL, -- La operazione effettuata
);
GO
/*
Faccio i 3 trigger di INSERT DELETE UPDATE
*/
-- Trigger di Insert _______________________________________________________________________________________
CREATE TRIGGER [dbo].[trAfIn] ON [dbo].[Or]
AFTER INSERT -- Puoi usare anche FOR al posto di AFTER ????
AS
declare @OrIdx int;
declare @Forx varchar(50);
declare @Notx varchar(50);
select @OrIdx=i.OrId, @Forx=i.OrFor from inserted i;
set @Notx='Inserito iiiiiii';
insert into Sp
(OrKe,Forn,Note)
values(@OrIdx,@Forx,@Notx);
-- questo testo viene stampato a video in Management nei risultati della query
PRINT 'Eseguito Insert Inserimento iiiiiiiiiiiiiiiiiiiiiiii'
GO
-- Trigger di Delete _________________________________________________________________________________________
CREATE TRIGGER [dbo].[trAfDe] ON [dbo].[Or]
AFTER DELETE -- Puoi usare anche FOR al posto di AFTER ????
AS
declare @OrIdx int;
declare @Forx varchar(50);
declare @Notx varchar(50);
select @OrIdx=d.OrId, @Forx=d.OrFor from deleted d;
set @Notx='Deletato dddddddd';
insert into Sp
(OrKe,Forn,Note)
values(@OrIdx,@Forx,@Notx);
-- questo testo viene stampato a video in Management nei risultati della query
PRINT 'Eseguito Delete Cancellazione ddddddddddddddddddddddddddddddd'
GO
-- Trigger di Update __________________________________________________________________________________
CREATE TRIGGER [dbo].[trAfUp] ON [dbo].[Or]
AFTER UPDATE -- Puoi usare anche FOR al posto di AFTER ????
AS
declare @OrIdx int;
declare @Forx varchar(50);
declare @Notx varchar(50);
select @OrIdx=u.OrId, @Forx=u.OrFor from inserted u; -- Con updated non funziona ?????
set @Notx='Updatato uuuuuuu';
insert into Sp
(OrKe,Forn,Note)
values(@OrIdx,@Forx,@Notx);
-- questo testo viene stampato a video in Management nei risultati della query
PRINT 'Eseguito Update Aggiornamento uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu'
GO
/*
INSERISCO DELETO UPDATO qualcosa per testare il funzionamento
*/
-- Inserisco un po di dati _________________________________________________________________
SET IDENTITY_INSERT [dbo].[Or] ON
INSERT [dbo].[Or] ([OrId], [OrFor]) VALUES (15, N'Fornitore 030')
INSERT [dbo].[Or] ([OrId], [OrFor]) VALUES (18, N'Fornitore 036')
INSERT [dbo].[Or] ([OrId], [OrFor]) VALUES (19, N'Fornitore 038')
INSERT [dbo].[Or] ([OrId], [OrFor]) VALUES (25, N'Fornitore 050')
INSERT [dbo].[Or] ([OrId], [OrFor]) VALUES (31, N'Fornitore 062')
INSERT [dbo].[Or] ([OrId], [OrFor]) VALUES (36, N'Fornitore 072')
INSERT [dbo].[Or] ([OrId], [OrFor]) VALUES (54, N'Fornitore 108')
INSERT [dbo].[Or] ([OrId], [OrFor]) VALUES (59, N'Fornitore 118')
SET IDENTITY_INSERT [dbo].[Or] OFF
GO
/*
Se uso invece questa forma di inserimento massivo il Trigger mi
registra solo la prima riga ( quindi non va bene )
SET IDENTITY_INSERT [dbo].[Or] ON
INSERT [dbo].[Or]
([OrId], [OrFor])
VALUES
(15, N'Fornitore 030'),
(18, N'Fornitore 036'),
(19, N'Fornitore 038'),
(25, N'Fornitore 050'),
(31, N'Fornitore 062'),
(36, N'Fornitore 072'),
(54, N'Fornitore 108'),
(59, N'Fornitore 118');
SET IDENTITY_INSERT [dbo].[Or] OFF
GO
*/
-- Deleto un po di dati ______________________________________________________________________
DELETE FROM [Trig].[dbo].[Or]
WHERE OrId = 18
GO
DELETE FROM [Trig].[dbo].[Or]
WHERE OrId = 54
GO
DELETE FROM [Trig].[dbo].[Or]
WHERE OrId = 31
GO
/*
Se uso invece questa forma di Deletare massivo il Trigger mi
registra solo la prima riga ( quindi non va bene )
DELETE FROM [Trig].[dbo].[Or]
WHERE
((
(OrId) = 18
OR
(OrId) = 54
OR
(OrId) = 31
))
GO
*/
-- Updato un po di dati ______________________________________________________________________
UPDATE [Trig].[dbo].[Or]
SET OrFor = 'xxx'
WHERE ((OrId)=19)
GO
UPDATE [Trig].[dbo].[Or]
SET OrFor = 'yyy'
WHERE ((OrId)=36)
GO
UPDATE [Trig].[dbo].[Or]
SET OrFor = 'www'
WHERE ((OrId)=25)
GO
/*
Se uso invece questa forma di Updatare massivo il Trigger mi
registra solo la prima riga ( quindi non va bene )
UPDATE [Trig].[dbo].[Or]
SET OrFor = 'hhhh'
WHERE
((
(OrId)=19
Or
(OrId)=36
Or
(OrId)=25
))
*/
/* NB
Per quel poco che ho capito ci sono le tabelle
"inserted" e "deleted" dove trovi il record su cui lavori
Non c'è la tabella "updated"
*/
/* FINITO */