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

如何在使用SQL Server插入/更新数据之前验证数据?,sql,sql-server,sql-server-2008,triggers,ddl,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,

我有一个这样定义的表

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
的方式是错误的


如何正确添加触发器以验证
插入
更新
上的数据?

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

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

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

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

因为SQL server不知道根据ForeignPropertyId和ForeignValue引用的是哪个记录

1) 你应该使用魔法桌。inserted.ForeignPropertyId为NULL,inserted.ForeignValue为NULL

2) 您可以使用Instead Of触发器,而不是For/After触发器


如果你不太习惯使用触发器,我的建议是不要使用太多。将来它会让你头疼的

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

1) 你应该使用魔法桌。inserted.ForeignPropertyId为NULL,inserted.ForeignValue为NULL

2) 您可以使用Instead Of触发器,而不是For/After触发器


如果你不太习惯使用触发器,我的建议是不要使用太多。将来它会让你头疼的

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

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

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

如果一次插入一行,那么约束就可以了。

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

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

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

如果您一次插入一行,那么
约束就是解决方法。

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

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
notnull
约束

NOTNULL约束强制列不接受NULL值

您可以通过引用下面的代码段来更改现有列

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

为什么不能使用SQL
notnull
约束

NOTNULL约束强制列不接受NULL值

您可以通过引用下面的代码段来更改现有列

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

很酷!现在是我用谷歌搜索触发器和约束之间的区别的时候了。如果时间允许,我会接受你的回答。很酷!现在是我用谷歌搜索触发器和约束之间的区别的时候了。如果时间允许,我将接受您的回答。请在内部使用错误严重性或错误编号,或写一个检查约束而不是触发器使用内部错误严重性或错误编号,或写一个检查约束而不是触发器