Arhn - архитектура программирования

Как проверить данные перед вставкой/обновлением с помощью SQL Server?

У меня есть таблица, определенная так

CREATE TABLE [dbo].[ObjectRelationClauses]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY, 
    [RelationId] INT NOT NULL, 
    [OperatorType] NVARCHAR(3) NOT NULL, 
    [LocalPropertyId] INT NOT NULL, 
    [ForeignPropertyId] INT NULL, 
    [ForeignValue] VARCHAR(255) NULL, 
    [ParentClauseId] INT NULL
)

Мне нужно иметь возможность вызвать ошибку, если значение обоих столбцов ForeignPropertyId и ForeignValue равно null, иначе я хочу выполнить операцию.

Вот что я пробовал

CREATE TRIGGER [dbo].[Trigger_ObjectRelationClauses]
    ON [dbo].[ObjectRelationClauses]
    FOR INSERT, UPDATE
    AS
    BEGIN
        SET NoCount ON
        IF(ForeignPropertyId IS NULL AND ForeignValue IS NULL)
        BEGIN
           RAISERROR('Either ForeignPropertyId or ForeignValue must be provided to perform this action!')
        END

    END

но это дает мне синтаксическую ошибку. Возможно, я неправильно использую RAISERROR.

Как правильно добавить триггер для проверки данных на INSERT и UPDATE?


  • используйте серьезность ошибки или номер ошибки внутри функцияraiserror ИЛИ написать проверочное ограничение вместо триггера 30.07.2016

Ответы:


1

Это похоже на задание для контрольного ограничения, а не триггера:

ALTER TABLE [dbo].[ObjectRelationClauses]
ADD CONSTRAINT foreign_chk CHECK 
([ForeignPropertyId] IS NOT NULL OR [ForeignValue] IS NOT NULL);
30.07.2016
  • Очень круто! Пришло время погуглить разницу между триггером и ограничением. Я приму ваш ответ, когда позволит время. 30.07.2016

  • 2

    Вы можете добавить ограничение. Однако если вы вставляете несколько строк, ограничение не позволит вставлять любые строки. Чтобы обойти это, вы можете использовать триггер instead of.

    Но может быть проще просто сделать:

    insert into ObjectRelationClauses(. . .)
        select . . .
        from . . .
        where ForeignPropertyId is not null or ForeignValue is not null;
    

    Если вы вставляете по одной строке за раз, то constraint - это путь.

    30.07.2016

    3

    Поскольку SQL-сервер не знает, на какую запись вы ссылаетесь, в соответствии с ForeignPropertyId и ForeignValue.

    1) Вы должны были использовать ВОЛШЕБНЫЙ СТОЛ. вставлено.ForeignPropertyId имеет значение NULL И вставлено.ForeignValue равно NULL.

    2) Вы можете использовать триггер вместо триггера For/After.

    Если вам не очень удобно пользоваться триггером, мой совет — не используйте их слишком часто. Это доставит вам головную боль в будущем.

    30.07.2016

    4

    RAISERROR Требуемые уровни серьезности и состояния . Пожалуйста, используйте этот запрос

    CREATE TRIGGER [dbo].[Trigger_ObjectRelationClauses]
    ON [dbo].[ObjectRelationClauses]
    FOR INSERT, UPDATE
    AS
    BEGIN
        SET NoCount ON;
        DECLARE @ForeignPropertyId INT ,@ForeignValue varchar(255)
         Select @ForeignPropertyId=  i.ForeignPropertyId, @ForeignValue = i.ForeignValue from Inserted i
        IF(@ForeignPropertyId IS NULL AND @ForeignValue IS NULL)
        BEGIN
           RAISERROR ('Either ForeignPropertyId or ForeignValue must be provided to perform this action!',16,1)
        END
    
    END
    
    30.07.2016

    5

    Почему вы не можете использовать SQL NOT NULL Constraint?

    Ограничение NOT NULL заставляет столбец НЕ принимать значения NULL.

    Вы можете изменить существующий столбец, обратившись к приведенному ниже фрагменту.

    ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL;
    
    30.07.2016
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..