J'ai une table avec plusieurs loggings:
Je veux créer un triggersur afin que personne ne puisse répondre deux fois à la même question. Ce doit être un triggersur seulement.
CREATE TRIGGER sortinggger_Check_Duplicates ON submit_Answer FOR INSERT AS IF SELECT??? PRINT 'duplicate' raiserror('cant submit answer to same question twice') ROLLBACK End
Créer un triggersur
CREATE TRIGGER dbo.uniqueUserQuestion ON dbo.submit_Answer INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON IF EXISTS ( SELECT 1 FROM dbo.submit_Answer T INNER JOIN INSERTED I ON T.user_name = I.user_name AND T.question_id = I.question_id ) BEGIN -- Do dupe handling here PRINT 'duplicate' raiserror('cant submit answer to same question twice') return END -- actually add it in INSERT INTO dbo.submit_Answer SELECT * FROM INSERTED I END GO
MySQL ne prend pas en charge les triggersurs INSTEAD OF
, ce que vous devez utiliser ici. Dans SQL Server, vous utiliseriez un triggersur INSTEAD OF INSERT
qui se triggersra avant que l'insertion se produise, où vous pouvez écrire une vérification pour le doublon. Cependant, si vous pouvez éviter un triggersur, pourquoi ne pas utiliser une routine stockée et juste vérifier la copy avant de l'insert?
C'est, bien sûr, si vous ne pouvez vraiment, vraiment pas utiliser une contrainte.
Edit: Mise à jour de la réponse pour MSSQL.
Voici un exemple à partir de MSDN :
CREATE TRIGGER IO_Trig_INS_Employee ON Employee INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON -- Check for duplicate Person. If there is no duplicate, do an insert. IF (NOT EXISTS (SELECT P.SSN FROM Person P, inserted I WHERE P.SSN = I.SSN)) INSERT INTO Person SELECT SSN,Name,Address,Birthdate FROM inserted ELSE -- Log an attempt to insert duplicate Person row in PersonDuplicates table. INSERT INTO PersonDuplicates SELECT SSN,Name,Address,Birthdate,SUSER_SNAME(),GETDATE() FROM inserted -- Check for duplicate Employee. If no there is duplicate, do an INSERT. IF (NOT EXISTS (SELECT E.SSN FROM EmployeeTable E, inserted WHERE E.SSN = inserted.SSN)) INSERT INTO EmployeeTable SELECT EmployeeID,SSN, Department, Salary FROM inserted ELSE --If there is a duplicate, change to UPDATE so that there will not --be a duplicate key violation error. UPDATE EmployeeTable SET EmployeeID = I.EmployeeID, Department = I.Department, Salary = I.Salary FROM EmployeeTable E, inserted I WHERE E.SSN = I.SSN END
Vous devrez évidemment modifier / simplifier votre situation, mais le context de base est là.