繁体   English   中英

将触发器Oracle迁移到SQL Server

[英]Migrate trigger Oracle to SQL Server

人,

我需要将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;

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

谢谢你的帮助!

在任何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约束。 如果现有表缺少非空约束,我们可以使用与上面所示相同的语法添加它们,用NOT NULL替换DEFAULT子句 - 甚至在同一语句中组合两个子句。

我的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM