Come faccio a riscrivere questo trigger di aggiornamento senza utilizzare molte variabili?Ho bisogno di ottimizzare il mio primo trigger di aggiornamento T-SQL
Ho scritto il mio primo trigger SQL Server e funziona bene, ma penso che ci sia una soluzione più semplice.
Se si modifica almeno una delle 5 colonne, scrivo due nuove righe in un'altra tabella. riga 1 = vecchio Fahrer (= Driver) e vecchio dispodate e aggiornamento riga 2 = nuovo Fahrer e nuovo dispodato e aggiornatounetime La mia soluzione è solo una copia del trigger foxpro, ma ci devono essere soluzioni più semplici in T -SQL per verificare se una colonna è stata modificata.
ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[tbldisposaetze]
AFTER UPDATE
AS
SET NOCOUNT ON;
/*SET XACT_ABORT ON
SET ARITHABORT ON
*/
DECLARE @oldfahrer varchar(10)
DECLARE @oldbus varchar(10)
DECLARE @olddispodat date
DECLARE @oldvzeit decimal(4,0)
DECLARE @oldbzeit decimal(4,0)
DECLARE @oldbeschreibk varchar(255)
DECLARE @newfahrer varchar(10)
DECLARE @newbus varchar(10)
DECLARE @newdispodat date
DECLARE @newvzeit decimal(4,0)
DECLARE @newbzeit decimal(4,0)
DECLARE @newbeschreibk varchar(255)
SELECT @oldfahrer = fahrer,@oldbeschreibk=beschreibk,@oldbus=bus,@oldbzeit=bzeit,@olddispodat=dispodat,@oldvzeit=vzeit
FROM DELETED D
SELECT @newfahrer = fahrer,@newbeschreibk=beschreibk,@newbus=bus,@newbzeit=bzeit,@newdispodat=dispodat,@newvzeit=vzeit
FROM inserted I
if @oldbeschreibk <> @newbeschreibk or @oldbus <> @newbus or @oldbzeit <> @newbzeit or @oldfahrer <> @newfahrer or @oldvzeit <> @newvzeit
begin
IF (SELECT COUNT(*) FROM tbldispofahrer where [email protected] and [email protected]) > 0
update tbldispofahrer set laenderung = GETDATE() where [email protected] and [email protected]
else
INSERT into tbldispofahrer (fahrer,dispodat,laenderung) VALUES (@oldfahrer,@olddispodat,getdate())
IF (SELECT COUNT(*) FROM tbldispofahrer where [email protected] and [email protected]) > 0
update tbldispofahrer set laenderung = GETDATE() where [email protected] and [email protected]
else
INSERT into tbldispofahrer (fahrer,dispodat,laenderung) VALUES (@newfahrer,@newdispodat,getdate())
end
Ok prima non si dovrebbe usare le variabili come questo a tutti !! Mai in qualsiasi trigger. Le tabelle cancellate e inserite possono contenere più record e DEVI scrivere il codice per considerarlo. – HLGEM
Il tuo trigger ha ** MAJOR ** difetto in quanto sembri presumere che verrà chiamato ** una volta per riga ** - che è ** non ** il caso. Il trigger scatterà ** una volta per istruzione **, quindi se le tue istruzioni "UPDATE" riguardano 25 righe, il trigger verrà attivato ** una volta **, ma poi "Inserito" e "Eliminato" contengono ciascuna 25 righe . Quale di quelle 25 righe sceglierà il codice 'SELECT' ?? È non deterministico. È necessario riscrivere il trigger per tenerne conto! –
Qual è la colonna chiave principale nella tabella 'tbldispofahrer'. –