Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di pip19
    Registrato dal
    Dec 2001
    Messaggi
    512

    [SQLSERVER] Trigger insert, select e update

    Ciao,
    devo gestire inserimenti multipli che avvengono da più piattaforme ad una stessa tabella.

    Da una pagina mi arrivano dei dati che devo inserire in un record di una tabella.
    Successivamente devo prendere l'ID di questo record (e tutti gli altri dati) e inserirli in un'altra tabella.

    Sono arrivato a capire che devo utilizzare per forza un TRIGGER

    mi potete aiutare a scriverlo? Non l'ho mai fatto......
    ho anche trovato i modelli dei trigger che fornisce sql server, ma non riesco a districarmi molto facilmente...

    Grazie a chiunque possa darmi un aiuto

    P.S. per ora sono fermo qui:
    codice:
    USE miodb
    GO
    CREATE TRIGGER miodb.TRPROVA
       ON  miodb.prova
    .........(da qui in poi ho il vuoto, lo so, non è molto).........

  2. #2
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955

    Re: [SQLSERVER] Trigger insert, select e update

    Originariamente inviato da pip19
    Ciao,
    devo gestire inserimenti multipli che avvengono da più piattaforme ad una stessa tabella.

    Da una pagina mi arrivano dei dati che devo inserire in un record di una tabella.
    Successivamente devo prendere l'ID di questo record (e tutti gli altri dati) e inserirli in un'altra tabella.

    Sono arrivato a capire che devo utilizzare per forza un TRIGGER

    mi potete aiutare a scriverlo? Non l'ho mai fatto......
    ho anche trovato i modelli dei trigger che fornisce sql server, ma non riesco a districarmi molto facilmente...

    Grazie a chiunque possa darmi un aiuto

    P.S. per ora sono fermo qui:
    codice:
    USE miodb
    GO
    CREATE TRIGGER miodb.TRPROVA
       ON  miodb.prova
    .........(da qui in poi ho il vuoto, lo so, non è molto).........
    Non è detto che bisogna usare un trigger obbligatoriamente per fare quello che vuoi tu.
    Cmq, se volessi usare il trigger, dopo ON devi mettere INSERT (se è un trigger che si scatena su una INSERT, UPDATE su una UPDATE, DELETE su una DELETE).

    Dopo di che devi scrivere del codice T-Sql come se fosse una stored procedure.

    Una cosa, nei trigger su SQL Server, a seconda dell'operazione che stai triggerando hai a disposizione le tabelle inserted e/o deleted (inserted la trovi disponibile su insert e udpdate, deleted su update e delete).

    Poi ovviamente dipende cosa devi fare.

    P.S. Occhio a non creare dei loop con i trigger.

  3. #3
    Utente di HTML.it L'avatar di pip19
    Registrato dal
    Dec 2001
    Messaggi
    512
    ok grazie...
    un po sono andato avanti...

    ora mi chiedo... come passo le variabili dalla mia pagina web, al trigger per fare la insert correttamente con tutti i dati?

  4. #4
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da pip19
    ok grazie...
    un po sono andato avanti...

    ora mi chiedo... come passo le variabili dalla mia pagina web, al trigger per fare la insert correttamente con tutti i dati?
    Il trigger non ha parametri, viene invocato non direttamente da una pagina web ma da una operazione che fai a DB, ti rinnovo la richiesta, sei sicuro di dover usare i trigger? Non puoi scriverti metodi che salvano su più tabelle invece di usare i trigger?

  5. #5
    Utente di HTML.it L'avatar di pip19
    Registrato dal
    Dec 2001
    Messaggi
    512
    il problema è dato dal fatto che
    scrivo in una tabella e poi devo scrivere in un altra, portandomi dietro l'ID della prima tabella (per associarlo, ovviamente)

    per recuperare l'id appena inserito io faccio un ORDER BY ID DESC

    il problema è che se un altro mio collega allo stesso tempo scrive anche lui sulla stessa tabella, prendo l'ID sbagliato...

    come ovvieresti questo problema?

  6. #6
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    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.

    Originariamente inviato da pip19
    come ovvieresti questo problema?

    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  */

  7. #7
    Utente di HTML.it L'avatar di pip19
    Registrato dal
    Dec 2001
    Messaggi
    512
    uao,
    complimenti per lo script e grazie mille!

    infatti, visto che non mi sono mai avvicinato ai trigger, questo esempio è davvero per cultura... effettivamente però... ho sicurament emolti dati con cui riprendere l'ID appena inserito... anche se in realtà, ci sono molti duplicati... vedrò che fare... magari uso nel where proprio tutte le condizioni appena inserite..... a mali estremi, estremi rimedi...

  8. #8
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    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  */
    Se può tornare utile:

    La tabella INSERTED contiene tutte le righe inserite (ad esempio se faccio una insert multipla tutte le righe le trovo li dentro), la tabella DELETED contiene tutte le righe cancellate (ad esempio se faccio una cancellazione multipla tutte le righe le trovo li dentro).

    Non esiste la tabella updated perché in fase di update Sql Server popola sia la tabella deleted (le righe con i vecchi valori) e la tabella inserted (le righe con i nuovi valori), assimilando una update ad una operazione di delete/insert.

  9. #9
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Originariamente inviato da Joe Taras
    Se può tornare utile:

    Non esiste la tabella updated perché in fase di update Sql Server popola sia la tabella deleted (le righe con i vecchi valori) e la tabella inserted (le righe con i nuovi valori), assimilando una update ad una operazione di delete/insert.
    Questa non la sapevo


    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.