我想创建一个触发器,如果它有一个前一个条目,其中一个字段设置为一个值,则无法添加或更新条目。
让我们举一个例子:
鉴于下表:
id name type, description, (some other fields)
1 'Manuel' 'HUMAN' ...
2 'Manuel' 'DOG' ...
3 'Other name' 'HUMAN' ...
如果我想添加这样的新条目:
insert into table_name (name, type, description,...)
values ('Manuel', 'HUMAN', 'first entry', ...)
它不应该起作用,因为不应该允许为名称HUMAN
添加另一个Manuel
类型。
但是,应该允许这样做:
insert into table_name (name, type, description, ...) values ('Manuel', 'DOG', 'another description')
所以,基本上这个想法是,对于每个名称,它应该只允许一个HUMAN
条目类型。
我创建了这个触发器,但它无效:
CREATE OR REPLACE TRIGGER TABLE_TYPE_REL
BEFORE INSERT OR UPDATE ON table_name
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
WHEN (NEW.TYPE = 'HUMAN')
declare @check int
select @check = count(*)
from table_name as f
where f.type = 'HUMAN'
if @check <> 0
begin
rollback transaction
raiserror('Only one name, human is allowed.', 16, 1)
end
有任何线索吗?
答案 0 :(得分:4)
您的代码表明您使用的是Oracle。您发布的触发器代码适用于SQL Server。我将假设您实际上正在使用Oracle,并且您的触发器“无效”的原因是它是用错误的语言编写的(另外,包含错误堆栈而不是说某些东西“不起作用”真的很有帮助“)
听起来你想要一个基于函数的索引,它只包含type='HUMAN'
CREATE UNIQUE INDEX idx_one_human
ON table_name( CASE WHEN type = 'HUMAN'
THEN name
ELSE null
END );