>Ciao a tutti.
Ciao!
>utilizzo SQL Server 2000.
>
>Ho una tabella "A" con i seguenti campi (DataOra, Pippo, Pluto,
>Tizio, Caio, Sempronio).
>I dati vengono inseriti in tabella ogni minuto.
>
>Ho creato una tabella "B" con i campi DataOra e Caio.
>
>Vorrei che in automatico (ogni volta che si aggiorna la tabella
>"A") venisse copiato sulla tabella "B" l'ultimo dato inserito,
>ma solo i campi DataOra e Caio.
>Vorrei che venisse fatto in automatico dal Database SQL stesso
>senza usare del codice.
>Ho sentito parlare di trigger e stored procedure. Quale devo
>usare fra queste 2?
Personalmente non stimo i trigger e tendo ad utilizzarli il meno possibile per alcuni di motivi
1) Sono pressochè invisibili, nel senso che non saltano all'occhio a meno che non si controllino per bene le caratteristiche delle tabelle.
2) A volte sono pericolosi poichè potrebbero coinvolgere altri oggetti, creando conflitti irrisolvibili (se male utilizzati, ovviamente)
3) Non sono sempre chiari a livello di documentazione del progetto
Preferisco la soluzione stored procedure, poichè di solito mi offre maggiore controllo e modularità anche nel contesto di sicurezza del database.
Quindi, in definitiva, mi sento di consigliarti l'utilizzo delle stored procedure.
>Potreste postarmi un esempio?
sono "sottoprogrammi" più o meno articolati, che sfruttano il linguaggio T-SQL per attuare anche logiche di business.
proviamo a vedere il tuo esempio:
USE tempdb;
GO
-- creo le tabelle
----------------------------------------------------------------------
CREATE TABLE #tabellaA
(
ID int IDENTITY(1,1) Primary Key CLUSTERED,
DataOra smalldatetime NOT NULL,
Pippo tinyint NOT NULL,
Pluto char(1) NOT NULL,
Tizio int NOT NULL,
Caio int NOT NULL,
Sempronio int NOT NULL
)
GO
CREATE TABLE #tabellaB
(
ID int IDENTITY(1,1) Primary Key CLUSTERED,
DataOra smalldatetime NOT NULL,
Caio int NOT NULL
)
GO
----------------------------------------------------------------------
-- creo la stored procedure
----------------------------------------------------------------------
CREATE PROCEDURE CopiaRecordInTabellaB
@DataOra smalldatetime,
@Pippo tinyint,
@Pluto char(1),
@Tizio int,
@Caio int,
@Sempronio int
AS
BEGIN
-- disattivo i messaggi
SET NOCOUNT ON;
-- apro la transazione per mantenere atomica l'operazione.
-- nel caso in cui si verifichi un errore al suo interno, annullo tutto con rollback.
BEGIN TRAN
INSERT #tabellaA
SELECT @DataOra, @Pippo, @Pluto, @Tizio, @Caio, @Sempronio
-- inserisco anche su tabellaB
INSERT #tabellaB
SELECT @DataOra, @Caio
COMMIT TRAN
END
----------------------------------------------------------------------
GO
-- la eseguo
----------------------------------------------------------------------
DECLARE @DataCorrente smalldatetime
SET @DataCorrente = GETDATE()
EXEC CopiaRecordInTabellaB @DataCorrente, 1, 'A', 1, 1, 1
EXEC CopiaRecordInTabellaB @DataCorrente, 2, 'B', 2, 2, 2
EXEC CopiaRecordInTabellaB @DataCorrente, 3, 'C', 3, 3, 3
EXEC CopiaRecordInTabellaB @DataCorrente, 4, 'D', 4, 4, 4
EXEC CopiaRecordInTabellaB @DataCorrente, 5, 'E', 5, 5, 5
GO
----------------------------------------------------------------------
-- ricavo i record inseriti
----------------------------------------------------------------------
SELECT
*
FROM
#tabellaA
SELECT
*
FROM
#tabellaB
----------------------------------------------------------------------
-- faccio pulizia
----------------------------------------------------------------------
DROP TABLE #tabellaA
DROP TABLE #tabellaB
DROP PROCEDURE CopiaRecordInTabellaB
----------------------------------------------------------------------
>
>Grazie Mille in anticipo
di nulla!
Alx81 =)
http://blogs.dotnethell.it/suxstellino