People,
我需要将 Oracle 触发器迁移到 SQL 服务器,但我做不到。
Oracle 中的触发器非常简单:
CREATE OR REPLACE TRIGGER trigger_teste
BEFORE INSERT OR UPDATE
ON teste
FOR EACH ROW
DECLARE
BEGIN
:new.id := (coalesce(:NEW.id, 0));
:new.vlr_sal := (coalesce(:NEW.vlr_sal, 0.00));
END;
我尝试了几种方法,但没有一种成功!
谢谢你的帮助!
我的 T-SQL 有点生疏,但这样的东西应该可以工作。请注意,SQL 服务器没有行级别触发器,只有语句级别触发器。
CREATE TRIGGER trigger_teste
ON teste
BEFORE INSERT OR UPDATE
AS
update inserted
set id = coalesce(id, 0),
vlr_sal = coalesce(vlr_sal, 0.0)
GO
(不确定我是否错过了分号。我从来不明白SQL Server何时需要或不需要
)有关更多详细信息,请参阅手册:
http://msdn.microsoft.com/en-US/library/ms189799%28v=sql.90%29http://msdn.microsoft.com/en-US/library/ms191300%28v=sql.90%29
在任何风格的 RDBMS 中,这都不合适使用触发器。 SQL 标准允许我们在使用 DEFAULT 约束语法创建表时定义默认值。 Oracle和SQL Server都有这个。
显然,您在创建表时尚未执行此操作。 好消息是我们可以使用 ALTER TABLE 来添加默认约束。 像这样的东西
alter table teste
alter column id set default 0
这是针对SQL Server的。 在甲骨文中,它将是:
alter table teste
modify id default 0
正如无名马所指出的那样,触发器的完全替换必须包括受影响列上的 NOT NULL 约束。 如果现有表缺少非空约束,我们可以使用与上面所示相同的语法添加它们,将 DEFAULT 子句替换为 NOT NULL
- 甚至在同一语句中组合这两个子句。