2016-07-30 2 views
1

У меня есть таблица, определенная как этотКак проверить данные перед вставкой/обновлением с помощью 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?

+1

использование ошибки тяжести или номер ошибки внутри [функция RAISERROR] (https://technet.microsoft.com/en-us/library/ms177497 (v = sql.105) .aspx) ИЛИ выписать чек ограничение вместо триггера – jfun

ответ

2

Это похоже на работу для проверки ограничения, а не триггер:

ALTER TABLE [dbo].[ObjectRelationClauses] 
ADD CONSTRAINT foreign_chk CHECK 
([ForeignPropertyId] IS NOT NULL OR [ForeignValue] IS NOT NULL); 
+1

Очень круто! Настало время для меня, чтобы Google отличался от триггера и ограничения. Я отвечу на ваш ответ, когда позволит время. – Jaylen

0

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

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

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

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

2

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

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

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

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

0

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 
0

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

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

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

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL; 
Смежные вопросы