Cme funziona il trigger e dove lo trovo?

giovedì 18 gennaio 2007 - 18.42

bluland Profilo | Guru

salve,
ecco la questione, ho un database sql server 2000, che ho backuppato (file .bak) e restorato dal server (windows 2003 server) sul mio pc locale (win xp pro), nel lavorare inserendo dati mi sono accorto o almeno credo, che da un insert in una tabella1 dovrebbe partire un trigger per fare l'update in un altra tabella2, in locale cio' pero non avviene invece sul server si.
Come potrei fare per capire cosa ho dimenticato, o cosa manca in locale ed anche cosa fa in piu' il server, inoltre ho notato un altra cosa l'update della tabella2 avviene dopo circa 20sec, vorrei gestire anche questo tempo se e' possibile,
idee su quali verifiche dovrei fare?

saluti
--------------------
Vincenzo PESANTE

marcovivio Profilo | Expert

Non puoi portarti in locale anche il trigger? Oppure se si tratta solo di inserimento dati, quando hai terminato e riporti tutte le tabelle che hai restorato sul server fai partire tu a mano tutti ti trigger che avrebbero dovuto azionarsi.
Tu probabilmente pensavi si aver copiato anche il trigger? Invece non è cosi?
Ciao
MV

bluland Profilo | Guru

In realta' credo di aver individuate quale' il trigger che poi in realta e' una SP, ed infatti le faccio partire manualmente mi ritrovo la tabella2 updata, ma il e' che sul server questo avviene in modo automatico.
questo e' il fatto che non riesco a capire..

saluti
--------------------
Vincenzo PESANTE

lbenaglia Profilo | Guru

>Non puoi portarti in locale anche il trigger?

Ciao marcovivio,

Un trigger fa riferimento alla tabella o alla vista sulla quale è definito, non è possibile "scorporarlo" o "dimenticarsene"

>Oppure se si tratta
>solo di inserimento dati, quando hai terminato e riporti tutte
>le tabelle che hai restorato sul server fai partire tu a mano
>tutti ti trigger che avrebbero dovuto azionarsi.
I triggers vengono eseguiti automaticamente nella transazione corrente, non è possibile "lanciarli a mano", eventualmente possono essere disabilitati tramite il comando ALTER TABLE.

>Tu probabilmente pensavi si aver copiato anche il trigger? Invece
>non è cosi?
Questa cosa è possibile solo se si è eseguito uno script della tabella SENZA essersi ricordati di esportare anche i triggers ad essa associati. In caso di RESTORE di un precedente BACKUP i triggers rimangono al loro posto

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

lbenaglia Profilo | Guru

>In realta' credo di aver individuate quale' il trigger che poi
>in realta e' una SP, ed infatti le faccio partire manualmente
>mi ritrovo la tabella2 updata, ma il e' che sul server questo
>avviene in modo automatico.
>questo e' il fatto che non riesco a capire..

Ciao Vincenzo,

ah, ecco, si tratta di una stored procedure, non di un trigger (sono due cose ben diverse ).
Non è che per caso sul server esistono uno o più triggers definiti per quella tabella che richiamano la stored procedure?
Puoi verificarlo eseguendo la stored procedure di sistema sp_helptrigger e se vuoi visualizzare il codice che lo compone puoi ricorrere alla stored procedure di sistema sp_helptext come nel seguente esempio:

USE pubs; EXEC sp_helptrigger @tabname = N'employee'; /* Output: trigger_name trigger_owner isupdate isdelete isinsert isafter isinsteadof ---------------- -------------- ----------- ----------- ----------- ----------- ----------- employee_insupd dbo 1 0 1 1 0 (1 row(s) affected) */ /* Visualizzo il suo codice */ EXEC sp_helptext @objname = N'employee_insupd'; /* Output: Text ---------------------------------------------------------------- CREATE TRIGGER employee_insupd ON employee FOR insert, UPDATE AS --Get the range of level for this job type from the jobs table. declare @min_lvl tinyint, @max_lvl tinyint, @emp_lvl tinyint, @job_id smallint select @min_lvl = min_lvl, @max_lvl = max_lvl, @emp_lvl = i.job_lvl, @job_id = i.job_id from employee e, jobs j, inserted i where e.emp_id = i.emp_id AND i.job_id = j.job_id IF (@job_id = 1) and (@emp_lvl <> 10) begin raiserror ('Job id 1 expects the default level of 10.',16,1) ROLLBACK TRANSACTION end ELSE IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl) begin raiserror ('The level for job_id:%d should be between %d and %d.', 16, 1, @job_id, @min_lvl, @max_lvl) ROLLBACK TRANSACTION end */

Per maggiori dettagli consulta i Books Online:

"sp_helptrigger"
http://msdn2.microsoft.com/en-us/library/aa933438.aspx

"sp_helptext"
http://msdn2.microsoft.com/en-us/library/aa933450.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluland Profilo | Guru

>>In realta' credo di aver individuate quale' il trigger che poi
>>in realta e' una SP, ed infatti le faccio partire manualmente
>>mi ritrovo la tabella2 updata, ma il e' che sul server questo
>>avviene in modo automatico.
>>questo e' il fatto che non riesco a capire..
>Ciao Vincenzo,
Ciao Lorenzo

>ah, ecco, si tratta di una stored procedure, non di un trigger
>(sono due cose ben diverse ).

Cerco di fare un po' d'ordine
allora, sto cercando di capire come nella tabella2 vengono inseriti i dati a seguito di un insert fatto nella tabella1, premetto che ho preso il file .bak dal server e restorato in locale quindi trigger etc ci sono anche li, solo che sul server avviene l'aggiornamento (in circa 20sec) invece in locale no!
1. la prima cosa che ho pensato e' a qualche trigger, ma poi si pone la domanda perche in locale cmq non funziona???
2. poi ho trovato un SP che fa un Update della tabella2, ma non posso essere sicura che sia proprio quella che agisce dopo l'insert sulla tabella1.

tirando le somme le uniche differenze che vedo sono i sistemi operativi, ed inoltre il server all'epoca non l'ho configurato io, non so piu cosa andare a verificare!!
e poi infine mi resta questo dubbio del perche impiega proprio 20sec!!
sicuramente mi sfugge qualcosa, probabilemente la tabella1 e relazionata ad altre che poi fanno scattare qualche trigger prima di agire sulla tabella2??
che ne pensi?

saluti


--------------------
Vincenzo PESANTE

lbenaglia Profilo | Guru

>che ne pensi?
Penso che l'unico modo di sbrogliare la matassa è salire sulla macchine e vedere le differenze.
Mi spiace, la cause sono troppe per sparare ad indovinare...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluland Profilo | Guru

>>che ne pensi?
>Penso che l'unico modo di sbrogliare la matassa è salire sulla
>macchine e vedere le differenze.
>Mi spiace, la cause sono troppe per sparare ad indovinare...
>
Ecco una differenza che ho trovato:\
tramite Enterprice manager nella cartella Management-->Current Activity-->Locks/Object-->Miodatabase
ci sono tante voci che sembra che richiamino delle stored procedure, queste voci in locale non me le ritrovo, che cosa sono e come faccio ad aggiungerle??

ciao

>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

--------------------
Vincenzo PESANTE

lbenaglia Profilo | Guru

>Ecco una differenza che ho trovato:\
>tramite Enterprice manager nella cartella Management-->Current
>Activity-->Locks/Object-->Miodatabase
>ci sono tante voci che sembra che richiamino delle stored procedure,
>queste voci in locale non me le ritrovo, che cosa sono e come
>faccio ad aggiungerle??
"le voci" che vedi non sono altro che locks sugli oggetti (pagine, extent, tabelle, indici e db) dovuti al normale utilizzo del dbms.
In locale non ne hai perché nessuno sta utilizzando quel database
Le differenze sono altrove...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluland Profilo | Guru

Cerco di partire dal principio magari ho sbagliato il backup che ho fatto in questo modo:

--Eseguo il backup
BACKUP DATABASE myTest
TO DISK = N'C:\temp\myTest.bak'
WITH NOFORMAT, INIT
GO
/*
Se non conosco le informazioni sulla posizione ed i nomi logici dei
files utilizzo l'opzione FileListOnly
*/
RESTORE FILELISTONLY
FROM DISK ='c:\temp\myTest.bak'
GO
--Recuperato il LogicalName dei file mdf e ldf faccio il restore
--nella nuova posizione
RESTORE DATABASE myTest
FROM DISK ='C:\Temp\myTest.bak'
WITH
MOVE 'myTest' TO 'D:\MSSQL\Data\myTest.mdf',
MOVE 'myTest_Log' TO 'E:\MSSQL\LOG\myTest_Log.ldf'
GO


che ne dici?

lbenaglia Profilo | Guru

>BACKUP DATABASE myTest
...
>RESTORE DATABASE myTest

Se non cambi nome al database effettuerai uno spostamento dei file fisici che lo compongono!!!

USE master; BACKUP DATABASE AdventureWorks TO DISK = 'C:\AdventureWorks.bak'; /* Output: Processed 21168 pages for database 'AdventureWorks', file 'AdventureWorks_Data' on file 1. Processed 2 pages for database 'AdventureWorks', file 'AdventureWorks_Log' on file 1. BACKUP DATABASE successfully processed 21170 pages in 22.196 seconds (7.813 MB/sec). */ RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.bak' WITH MOVE 'AdventureWorks_Data' TO 'C:\AdventureWorks_Data.mdf', MOVE 'AdventureWorks_Log' TO 'C:\AdventureWorks_Log.ldf'; /* Output: Processed 21168 pages for database 'AdventureWorks', file 'AdventureWorks_Data' on file 1. Processed 2 pages for database 'AdventureWorks', file 'AdventureWorks_Log' on file 1. RESTORE DATABASE successfully processed 21170 pages in 42.553 seconds (4.075 MB/sec). */

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5