SQL триггер, чтобы остановить дубликаты в строке - PullRequest
1 голос
/ 18 августа 2011

У меня есть таблица с несколькими записями:

  • Имя_пользователя (например, «TOM»)
  • Question_ID (например, 'q002')
  • Ответ (например, 'D')

Я хочу создать триггер, чтобы никто не мог дважды ответить на один и тот же вопрос. Это должен быть только триггер .

CREATE TRIGGER trigger_Check_Duplicates

ON submit_Answer

FOR INSERT
AS

IF SELECT???

PRINT 'duplicate'

raiserror('cant submit answer to same question twice')

ROLLBACK

End

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Создать триггер

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
1 голос
/ 18 августа 2011

MySql не поддерживает триггеры INSTEAD OF, что вам нужно использовать здесь. В SQL Server вы бы использовали триггер INSTEAD OF INSERT, который сработает до того, как произойдет вставка, где вы можете написать проверку на дубликат. Однако, если вы можете избежать триггера, почему бы не использовать Stored Routine и просто проверить наличие дубликатов перед вставкой?

Это, конечно, если вы действительно не можете использовать ограничение.

Редактировать: Обновление ответа для MSSQL.

Вот пример прямо из 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

Вам, очевидно, нужно будет изменить / упростить ситуацию, но базовый контекст есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...