如何在使用SQL Server插入/更新之前验证数据?

时间:2016-07-30 18:55:45

标签: sql sql-server sql-server-2008 triggers ddl

我有一个像这样定义的表

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
)

如果ForeignPropertyIdForeignValue列的值都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的方式是错误的。

如何正确添加触发器以验证INSERTUPDATE上的数据?

5 个答案:

答案 0 :(得分:2)

这看起来像是一个检查约束的工作,而不是一个触发器:

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

答案 1 :(得分:2)

您可以添加约束。但是,如果要插入多行,则约束将阻止插入任何行。要解决此问题,您可以使用instead of触发器。

但是,这样做可能更容易:

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

如果您一次插入一行,那么constraint即可。

答案 2 :(得分:0)

因为SQL服务器根据ForeignPropertyId和ForeignValue不知道您引用的是哪条记录。

1)您应该使用MAGIC TABLE。 inserted.ForeignPropertyId为NULL且inserted.ForeignValue为NULL。

2)你可以使用替代触发器,而不是For / After触发器。

如果你对触发器不太满意,我的建议是不要过多使用它们。这会让你在将来头疼。

答案 3 :(得分: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

答案 4 :(得分:0)

为什么你不能使用SQL NOT NULL约束?

NOT NULL约束强制列不接受NULL值。

您可以参考以下代码段来更改现有列。

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL;