繁体   English   中英

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

[英]How can I validate data before insert/update with 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
)

我需要能够提高一个错误,如果两者的价值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上的数据?

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

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

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

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

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

如果您一次插入一行,那么constraint就是要走的路。

因为SQL Server不知道您根据ForeignPropertyId和ForeignValue引用的记录。

1)您应该已经使用了MAGIC TABLE。 insert.ForeignPropertyId为NULL,insert.ForeignValue为NULL。

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

如果您对扳机不太满意,我的建议是不要过多使用扳机。 将来会让您头疼。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM