0

人们,

我需要将 Oracle 触发器迁移到 SQL Server,但我做不到。

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;

我尝试了几种方法,但都没有成功!

感谢您的帮助!

4

2 回答 2

1

我的 T-SQL 有点生锈,但这样的东西应该可以工作。请注意,SQL Server 没有行级触发器,只有语句级触发器。

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%29
http://msdn.microsoft.com/en-US/library/ms191300%28v=sql.90%29

于 2012-07-07T08:55:46.423 回答
1

在任何类型的 RDBMS 中,这都不适合使用触发器。SQL 标准允许我们在使用DEFAULT 约束语法创建表时定义默认值。Oracle 和 SQL Server 都有这个。

显然,您在创建表时还没有这样做。好消息是我们可以使用 ALTER TABLE 添加默认约束。像这样的东西

alter table teste 
   alter column id set default 0

这是针对 SQL Server 的。在 Oracle 中它将是:

alter table teste 
   modify id default 0 

正如无名马指出的那样,触发器的完整替换必须包括对受影响列的 NOT NULL 约束。如果现有表缺少非空约束,我们可以使用与上面所示相同的语法添加它们,将 DEFAULT 子句替换为NOT NULL- 甚至在同一语句中组合这两个子句。

于 2012-07-07T08:27:18.600 回答