Nano Hash - криптовалюты, майнинг, программирование

Почему мой триггер для предотвращения дублирования строк не работает?

Прежде чем кто-либо предложит уникальный индекс или ключ, у меня есть очень хороший аргумент в пользу этого.

Я использую этот триггер из триггера для предотвращения вставки повторяющихся данных двух столбцов:

CREATE TRIGGER LogDuplicates ON bkPersonPoints
FOR INSERT
AS
if exists (select * from bkPersonPoints c 
                    inner join inserted i 
                        on c.Name = i.Name and c.Points = i.Points)
begin
    rollback
end
GO

Этот ответ принят и имеет 15 голосов, поэтому я ожидаю, что он сработает, но даже при моей самой первой вставке в пустую таблицу:

insert bkPersonPoints (Name, Points) values ('Brady', 100)

Я получаю сообщение об ошибке:

Транзакция завершилась в триггере. Пакет был прерван.

ПРИЛОЖЕНИЕ. Таблица выглядит следующим образом:

CREATE TABLE [dbo].[bkPersonPoints](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Points] [int] NOT NULL
) ON [APP_BR2_User]

  • Комментарий Скотта к этому ответу содержит ключевую информацию — вам нужно убедиться, что строки в inserted не совпадают с самими собой в таблице (поскольку это for/ after триггер, вставленные строки уже есть в таблице) 05.05.2017

Ответы:


1

Это происходит потому, что он обнаруживает запись, которую вы сейчас вставляете в таблицу. Вам нужно отфильтровать это из предложения EXISTS:

CREATE TRIGGER LogDuplicates ON bkPersonPoints
FOR INSERT
AS
if exists (select * from bkPersonPoints c 
                    inner join inserted i 
                        on c.Name = i.Name 
                        and c.Points = i.Points
                        and c.id <> i.id)
begin
    rollback
end
GO
05.05.2017
  • Да, спасибо. У меня были некоторые сомнения относительно записи, уже существующей AFTER INSERT, но в моем требовании ответа идея ПК ускользнула от меня. 05.05.2017

  • 2

    В любом случае, предложите ОГРАНИЧЕНИЕ

    ALTER TABLE bkPersonPoints
      ADD CONSTRAINT c_uniq_Name_and_points UNIQUE (Name, Points)
    
    05.05.2017
  • Буквально первая строка вопроса начинается до того, как кто-либо предложит уникальный индекс или ключ... 05.05.2017
  • Лучше быть чертовски хорошим случаем, чтобы не использовать конкретную функцию базы данных, предназначенную для обработки именно этой ситуации... 05.05.2017
  • @Damien_The_Unbeliever да, но я думаю, что нет смысла использовать триггер для проверки уникальности, поэтому я предложил :3 05.05.2017
  • Мой вариант использования не обязательно просто предотвращает вставку записи, но регистрирует потенциальный дубликат и, надеюсь, что-то о том, что вызвало дублирующую вставку. Мне может даже понадобиться не препятствовать вставке, а просто обнулить сумму на дубликате. Уникальный ключ бесполезен ни для чего из этого, кроме предотвращения вставки. 05.05.2017

  • 3

    Этот ответ был вдохновлен ответом, опубликованным 13 апреля 2020 г. в 18:34 в Триггер для предотвращения вставки повторяющихся данных двух столбцов.

    СОЗДАЙТЕ ТРИГГЕР MyTrigger ON dbo.MyTable
    ВМЕСТО ВСТАВКИ
    КАК

    если не существует (
    выберите * из MyTable t
    внутреннее соединение вставлено i
    на i.name=t.name и i.date=t.date и i.id ‹› t.id )
    begin
    Вставить в MyTable (имя, дата) Выберите имя, дату из вставленного файла
    end
    else
    THROW 51000, 'Выражение прекращено, так как для него обнаружен дубликат объект', 1;
    перейти

    31.05.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..