数据库触发器DB2和SQL Server的异同

大部分数据库语句的基本语法是相同的,但具体要具体的每一种数据库,又有些不一样,例如触发器,DB2和SQL Server两种很大的不同。

例如DB2的一个触发器:

CREATE TRIGGER EAS.trName
  NO CASCADE BEFORE insert //插入触发器
 ON eas.T_user
 REFERENCING NEW    AS N_ROW //把新插入的数据命名为N_ROW
 FOR EACH ROW MODE DB2SQL  //每一行插入数据都出发此操作
BEGIN ATOMIC  //开始
DECLARE U_xtfidemp1 varchar(36); //定义变量
DECLARE u_xtempcode1 varchar(20);
DECLARE u_xtempcodeCount int ;
DECLARE U_xtfidempCount int ;
DECLARE u_id1 int ;
set  U_xtfidemp1=N_ROW.U_xtfidemp;//把新插入的数据赋值给变量
set  u_xtempcode1=N_ROW.u_xtempcode;
set  u_id1=N_ROW.u_id;
  set u_xtempcodeCount=  (select count(u_xtempcode) from eas.T_user where u_xtempcode is not null and u_xtempcode=u_xtempcode1 and u_id<>u_id1);
  set U_xtfidempCount=(select count(U_xtfidemp) from eas.T_user where U_xtfidemp is not null and U_xtfidemp=U_xtfidemp1 and u_id<>u_id1);

 IF u_xtempcodeCount>0 or U_xtfidempCount>0  THEN
         SIGNAL SQLSTATE ‘80000‘ (‘eas.T_user Exceeds u_xtempcode,U_xtfidemp 插入数据时有错误,有重复‘);
  END IF;
END

在SQL Server中的写法为:

CREATE TRIGGER EAS.trName
  for insert //插入触发器  DB2 写法 NO CASCADE BEFORE insert
 ON eas.T_user
    //SQL Server没有  把新插入的数据命名为N_ROW  REFERENCING NEW    AS N_ROW
     //SQL Server没有     FOR EACH ROW MODE DB2SQL  //每一行插入数据都出发此操作
BEGIN //  SQL Server没有   ATOMIC  //开始
DECLARE @U_xtfidemp1 varchar(36); //定义变量  DB2 写法 没有@
DECLARE @u_xtempcode1 varchar(20);
DECLARE @u_xtempcodeCount int ;
DECLARE @U_xtfidempCount int ;
DECLARE @u_id1 int ;
//set  U_xtfidemp1=N_ROW.U_xtfidemp;
//set  U_xtfidemp1=N_ROW.U_xtfidemp
//set  u_xtempcode1=N_ROW.u_xtempcode;

 -- 从inserted临时表中获取记录值  //把新插入的数据赋值给变量
    select @U_xtfidemp1 = U_xtfidemp,
           @u_xtempcode1 = u_xtempcode,
           @u_id1 = u_id
           from inserted
  set @u_xtempcodeCount=  (select count(u_xtempcode) from eas.T_user where u_xtempcode is not null and u_xtempcode=@u_xtempcode1 and u_id<>@u_id1);
  set @U_xtfidempCount=(select count(U_xtfidemp) from eas.T_user where U_xtfidemp is not null and U_xtfidemp=@U_xtfidemp1 and u_id<>@u_id1);

 IF
@u_xtempcodeCount>0 or @U_xtfidempCount>0  THEN

   // SIGNAL SQLSTATE ‘80000‘ (‘eas.T_user Exceeds u_xtempcode,U_xtfidemp 插入数据时有错误,有重复‘);  END IF;END

可以看到虽然创建触发器的基本语法是相同的,但具体细节又不一样。

1定义变量的方式不一样.

DB2定义变量时,没有要求@开头,但是SQL Server定义时要求以@开头

2对插入的临时表叫法不一。

DB2里边叫REFERENCING NEW,你可以改成其他的名称,SQL Server叫做inserted

3取插入的临时表数据方法不一样

DB2里边使用点的方式取值,但SQL Server可以使用select取值,在 DB2里使用select取值就会报错。另外 DB2里边似乎不能通过select的方式赋值。

4触发器的触发的方式不太一样。

例如 DB2里可以规定是不是每一行都出发,但SQL Server里边没这样的功能,一次插入100条数据,也只触发一次。

5触发后的操作不一样

同时for类型的触发器,DB2在触发器里没有异常时,会插入数据或者更新数据,SQL Server在触发器里没有异常时,是不会插入数据的或者更新数据,除非在触发器中写了插入或者是更新的SQL。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 19:12:53

数据库触发器DB2和SQL Server的异同的相关文章

此数据库文件与当前sql server实例不兼容

在vs2015导入mdf数据库文件时提示:此数据库文件与当前sql server实例不兼容. mdf文件的版本是SQL SERVER 2005的,而VS2015自带的数据库是LocalDB,直接导入该mdf文件时会提示:此数据库文件与当前sql server实例不兼容. 解决方法是把sql server 2005的mdf文件转成LocalDB可操作的mdf文件. 以下是操作方法,直接用VS2015即可完成, 不需要安装SQL SERVER. 服务器资源管理器 -> 连接到数据库 服务器名:直接填

sql数据库恢复 文件丢失误删除 误格式化置疑报错修复 数据库置疑修复总结/SQL SERVER 2000/2005/2008/2008R2

数据库置疑的原因会有多种多样,不同的问题采用的步骤也会有所不同,以下的步骤不能适用所有的情况,但包括了一些基本的步骤. 数据库置疑是指数据库内部处于不一致的状态,很有可能会有数据丢失.我们推荐您从做数据库备份之前,检查过DBCC  CHECKDB没有错误,备份的数据库没有更改.    1.首先确认已经备份了.mdf和.ldf文件. 2. 在SQL Server中新建一个同名的数据库,然后停止SQL Server服务. 3. 用原有的.mdf和.ldf文件覆盖新建数据库对应的.mdf和.ldf文件

最佳实践 · 实例级别数据库上云RDS SQL Server

摘要: 摘要 到目前,我们完成了SQL Server备份还原专题系列八篇月报分享:三种常见的数据库备份.备份策略的制定.查找备份链.数据库的三种恢复模式与备份之间的关系.利用文件组实现冷热数据隔离备份方案.如何监控备份还原进度.阿里云RDS SQL自动化迁移上云的一种解决方案以及上个月分享的RDS SDK实现数据库迁移上阿里云,本期我们分享如何将用户线下或者ECS上自建实例级别数据库一键迁移上阿里云RDS SQL Server. 摘要到目前,我们完成了SQL Server备份还原专题系列八篇月报

Mybatis中oracle、mysql、db2、sql server的like模糊查询

<!-- oracle --> <select id="searchUserBySearchName" parameterType="java.lang.String" resultType="com.urm.entity.User"> select * from t_user where user_name like CONCAT('%',#{search_name},'%') </select> <!

MySql数据库数据类型和Sql Server 数据库数据类型之间的差异

1. MySQL支持enum和set类型,SQL Server不支持:2. MySQL不支持nchar.nvarchar.ntext类型:3. MySQL数据库的递增语句是AUTO_INCREMENT,而MS SQL是identity(1,1):4. MS SQL默认到处表创建语句的默认值表示是((0)),而在MySQL里面是不允许带两括号的:5. MySQL需要为表指定存储类型:6. MS SQL识别符是[],[type]表示他区别于关键字,但是MySQL却是 `,也就是按键1左边的那个符号:

关系型数据库性能测试参考指标----SQL Server

注:以下指标取自SQL Server自身提供的性能计数器. [@[email protected]] SQL Server 指标名称 指标描述 指标范围 指标单位 1.SQL Server中访问方法(Access Methods)对象包含的性能计数器 全表扫描/秒 (Full Scans/sec) 指每秒全表扫描的数量.全表扫描可以是基本表扫描或全索引扫描.由于全表扫描需要耗费大量时间,因此全表扫描的频率过高的话,会影响性能. 如果该指标的值比1或2高,应该分析设计的查询以确定是否确实需要全表扫

数据库问题——无法与SQL Server建立连接

在打开VS启动程序的时候,出现了如下错误. 由此推断是与数据库的连接出了问题.确定了代码写的没问题,又打开了SQL Server 2012,但是却连接不上服务器,出现了与在VS中一样的问题(这里需要注意,我们平时运行程序与数据库相连是不用打开SQL Server的). 回想起之前学数据库的时候遇到过这样的问题,碰巧韩林在身边,给解决了.但是却没有及时总结.导致现在遇到这样的问题一时找不着北.出现这样的问题,是因为SQL Server的部分服务处于关闭状态,打开就OK了.以我的电脑win8为例,具

C#将Excel数据导入数据库(MySQL或Sql Server)

最近一直很忙,很久没写博客了.今天给大家讲解一下如何用C#将Excel数据导入Excel,同时在文章最后附上如何用sqlserver和mysql工具导入数据. 导入过程大致分为两步: 1.将excel数据导入到DataSet中; 2.将DataSet里面的数据遍历插入到对应的数据库 一.将excel数据导入到DataSet中 需添加引用using System.Data; using System.Data.OleDb; public static DataSet ReadExcel(strin

将SQL Azure数据库备份到本地SQL Server 2012

整个备份过程可以分为如下两大步骤进行: 一.通过"Export Data-tier Application"先将目标SQL Azure的数据库备份到本地,详细步骤如下: 1.启动SQL Server Management Studio,连接目标SQL Azure.选择SQL Azure中要备份的目标数据库,右键选择"Export Data-tier Application"菜单: 2.进入开始页面,选择"Next": 3.在"Expor