2010-07-29 3 views
10

Mi sono perso quando volevo creare trigger utilizzando il "CREATE TRIGGER" predefinito di SQL Server 2008 R2. Potresti per favore darmi una dichiarazione SQL diretta che posso usare per creare un trigger e dirmi come definire AFTER, PRIMA, e tutto il resto?Crea trigger in SQL Server

Inoltre, come posso conoscere le righe AGGIORNATE/INSERITE/CANCELLATE e utilizzare i relativi valori di colonna per eseguire operazioni all'interno del trigger?

+0

@ John: Il prodotto si chiama "SQL Server", non "MSSQL". "MSSQL" può essere facilmente confuso con "MySQL". Inoltre, quando si fa una domanda su SQL Server, suggerisco di usare il tag "sql-server". "sql" è per domande generali sul linguaggio SQL. –

+0

Ok grazie per la nota. Lo farà. – johnshaddad

+0

La tua domanda è semplicemente su come definire un trigger o è come scrivere un trigger che puoi usare per operare sulle righe interessate? Se il più tardi, allora dovresti prendere in considerazione la riformulazione della tua domanda. – Thomas

risposta

2

I database sono orientati al set e i trigger non sono diversi. Un trigger si attiva quando viene eseguita una determinata operazione e tale operazione potrebbe influire su più righe. Quindi, la domanda "Say I want to know the Primary Key of that row" è un termine improprio. Potrebbero essere inserite più righe.

SQL Server fornisce due tabelle speciali per i trigger AFTER denominati inserted e deleted che rappresentano le righe che sono state inserite o eliminate da un'azione e sono strutturate in modo identico alla tabella interessata. Un trigger di aggiornamento può popolare sia inserted e deleted mentre un trigger di inserimento popolerà solo la tabella inserted.

Dai commenti:

ma il destinatario dell'e-mail verrà deciso in base su un valore in una seconda tabella, in cui l'ID chiave esterna si trova nella prima tabella (che è quello con grilletto

La risposta a questa domanda è utilizzare la tabella inserted (che di nuovo, è necessario assumere più righe) per scorrere le righe e inviare un messaggio di posta elettronica, tuttavia, si consiglia di non inserire la logica della posta elettronica in un trigger. , Consiglierei di mettere quella logica in una stored procedure e di inviare la tua email da t cappello.

Per riferimento: Create Trigger

+0

E poi chiamare quella procedura dal trigger? È questo che vuoi dire?Ma la procedura del sistema di posta sql non è sufficiente per gestirla nel trigger? o dovrei creare una procedura che chiama quella procedura di sistema e quindi chiamare questa procedura nel trigger? – johnshaddad

+0

@johnshaddad - No. Non farei operazioni di posta elettronica da un trigger. Invece, vorrei che il codice chiamante usasse il proc memorizzato invece di operare direttamente sulla tabella. – Thomas

+0

Quando hai detto "potrebbero essere inserite più righe". non fa scattare il grilletto più volte? O come? Potresti spiegare come farei in questo caso? – johnshaddad

2

Un trigger è un processo basato su eventi che viene "attivato" dopo che una tabella è stata modificata in qualche modo. Questo sarà su DELETE, UPDATE, INSERT e così via. La sintassi PRIMA e DOPO definirà se eseguire il trigger prima o dopo che l'evento è stato eseguito.

Questa è la versione breve. Controlla MSDN.

+0

Sì, ho familiarità con i trigger su MySQL ma non su MSSQL, quindi ho pensato che esistesse un modo diverso di implementare. Grazie! – johnshaddad

+0

Ma come posso sapere quale riga viene aggiornata? Di 'voglio sapere la chiave primaria di quella riga, come si fa? Qualcosa come inviare un'e-mail dopo l'aggiunta di un nuovo elemento, ma il destinatario dell'email verrà deciso in base a un valore in una seconda tabella, in cui l'ID della chiave esterna si trova nella prima tabella (che è quella con trigger) – johnshaddad

+0

mrdenny's commento in risposta alla risposta di Joel Coehoorn è un buon riassunto. –

10

La sintassi di base è

CREATE TRIGGER YourTriggerName ON dbo.YourTable 
FOR|AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    /*Put what ever you want here*/ 
    UPDATE AnotherTable 
      SET SomeColumn = AnotherColumn 
    FROM inserted | deleted 
END 
GO 
+0

Sto provando questo e non sta funzionando per me nel server MS. –