将触发器Oracle迁移到SQL Server

问题描述 投票:0回答:3

人物,

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

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

感谢您的帮助!

sql-server oracle triggers
3个回答
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%29http://msdn.microsoft.com/en-US/library/ms191300%28v=sql.90%29


1
投票

这不适用于任何形式的RDBMS触发器。使用the DEFAULT constraint syntax创建表时,SQL标准允许我们定义默认值。 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约束。如果现有表缺少非null约束,我们可以使用如上所示的相同语法添加它们,用NOT NULL替换DEFAULT子句-甚至在同一条语句中组合两个子句。


0
投票
CREATE TRIGGER [dbo].[TRG_LOG_TEST] ON [dbo].[TEST]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @lg_name VARCHAR(128)
SELECT
@lg_name = login_name,
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID
IF EXISTS (SELECT * FROM inserted)
BEGIN
INSERT INTO [TEST_LOG]
SELECT *, GETDATE(), @lg_name ,'I' from deleted
END 

如何将该SQL Server触发器从T-SQL迁移到PL / SQL

© www.soinside.com 2019 - 2024. All rights reserved.