J'ai du mal à faire fonctionner un déclencheur TSQL correctement. Je l'ai exécuté à travers le débogueur et il ne définit pas des variables selon SQL Server Management Studio. La chose la plus foutue est que le déclencheur lui-même s'exécute correctement et qu'il n'y a pas d'erreur quand il est exécuté (il suffit de dire 'execution successful').Le déclencheur TSQL ne sauvegarde pas les variables et/ou ne s'exécute pas correctement
Le code est le suivant (il est un travail en cours .... juste obtenir mon auto familier):
USE TestDb
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'OfficeSalesQuotaUpdate' AND type = 'TR')
DROP TRIGGER OfficeSalesQuotaUpdate
GO
CREATE TRIGGER OfficeSalesQuotaUpdate
ON SalesReps
AFTER UPDATE, DELETE, INSERT
AS
DECLARE @sales_difference int, @quota_difference int
DECLARE @sales_original int, @quota_original int
DECLARE @sales_new int, @quota_new int
DECLARE @officeid int
DECLARE @salesrepid int
--UPDATE(Sales) returns true for INSERT and UPDATE.
--Not for DELETE though.
IF ((SELECT COUNT(*) FROM inserted) = 0)
SET @salesrepid = (SELECT SalesRep FROM deleted)
ELSE
SET @salesrepid = (SELECT SalesRep FROM inserted)
--If you address the @salesrepid variable, it does not work. Doesn't even
--print out the 'this should work line.
PRINT 'This should work...' --+ convert(char(30), @salesrepid)
IF (@salesrepid = NULL)
PRINT 'SalesRepId is null'
ELSE
PRINT 'SalesRepId is not null'
PRINT convert(char(50), @salesrepid)
SET @officeid = (SELECT RepOffice
FROM SalesReps
WHERE SalesRep = @salesrepid)
SELECT @sales_original = (SELECT Sales FROM deleted)
SELECT @sales_new = (SELECT Sales FROM inserted)
--Sales can not be null, so we'll remove this later.
--Use this as a template for quota though, since that can be null.
IF (@sales_new = null)
BEGIN
SET @sales_new = 0
END
IF (@sales_original = 0)
BEGIN
SET @sales_original = 0
END
SET @sales_difference = @sales_new - @sales_original
UPDATE Offices
SET Sales = Sales + @sales_difference
WHERE Offices.Office = @officeid
GO
Alors, des conseils? J'ai complètement perplexe sur celui-ci. Merci d'avance.
tout ce qui pourrait se tromper ici, votre déclencheur ISN » t bien écrit pour faire face aux opérations multi-lignes - les tables pseudo insérées et supprimées peuvent contenir plusieurs lignes. –
C'est bon, c'est juste pour la classe. Mais d'un autre côté, comment savez-vous comment avoir les deux lignes de chacune des tables virtuelles 'insérées' et 'mises à jour' lorsqu'il y a plus d'une rangée? – Nitrodist