是否可以在插入或更新值之前使用触发器修改值?

时间:2014-01-15 12:28:40

标签: triggers teradata

我们有几个应用程序将空字符串放入一个不可为空的数据库字段,这会导致其他期望值的应用程序出现问题。我现在要做的是在插入或更新之前将空字符串变为null,以便Teradata抛出Column 'whatever' is NOT NULL,这将导致在应用程序中抛出异常。

修改

我删除了我的旧的连词SQL,这是不正确的,并将其替换为实际可行的新SQL,但只是部分。

Replace trigger mydb.inserttest
before insert ON mydb.test
referencing new row as newrow
for each row
(
    set newrow.name = case when newrow.name = '' then null else newrow.name end;
);

这似乎在插入之前用空值替换空字符串。但是,当违反UPI时,它似乎也不会抛出异常。例如,我有下表:

create table mydb.test
(name varchar(20) not null)
unique primary index (name);

我可以第一次成功执行此语句:

insert into mydb.mytable ('joe');

它告诉我INSERT completed. 1 rows processed。但是,如果我再次运行它,它只会告诉我INSERT completed. 0 rows processed。您通常期望的是Duplicate unique prime key error,但触发器似乎以某种方式抑制了异常,导致调用.NET应用程序在违反UPI约束时无声地死亡。

1 个答案:

答案 0 :(得分:2)

为什么不检查约束?

create table mydb.test
(name varchar(20) not null, check (name <> ''))
unique primary index (name);