我有一个像这样定义的表
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
上的数据?
答案 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;