SQL Server

1创建触发器

GO
BEGIN
IF (object_id('WMY', 'tr') is not null)
DROP trigger WMY
END;
GO
CREATE TRIGGER WMY
ON Student
Instead of INSERT
AS
BEGIN
INSERT INTO Student (number,name) VALUES (1205,'角色2');
END;
--Begin 与end相当于{},是一个语句块,可有可无此处为演示所用
--ON 后面跟表明,表示作用于那个表
--ON Student下面(Instead of INSERT)可有改为(Instead of,after,for)(update,delete,Insert)

解析(以上列Insert触发器为例其他雷同)(以下先后顺序以插入表中数据的排序为例)

  • 当为Instead of 时,在触发器中的SQL语句代替你文中执行的插入语句,即当你在任何地方执行一个插入语句,这条语句实际没有执行而触发器里面的语句则执行
  • 当为for 时,在触发器中的SQL语句与你文中执行的插入语句都执行只是触发器中先于文中的执行
  • 当为 After时 在触发器中的SQL语句与你文中执行的插入语句都执行只是触发器中晚于文中的执行(网上都这样说可简单测试时与for效果一样)

摘自网上:

1 “Instead of”触发器

  • “Instead of”触发器在执行真正“插入”之前被执行。除表之外,“Instead of” 触发器也可以用于视图,用来扩展视图可以支持的更新操作。
  • “Instead of”触发器会替代所要执行的SQL语句,言下之意就是所要执行SQL并不会“真正执行”

2 “After”触发器

  • “After”触发器在Insert、Update或Deleted语句执行之后被触发。“After”触发器只能用于表。
  • “After”触发器主要用于表在修改后(insert、update或delete操作之后),来修改其他表

SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表

  • 这两个表由系统来维护,它们存在于内存中而不是在数据库中,可以理解为一个虚拟的表。
  • 这两个表的结构总是与被该触发器作用的表的结构相同。
  • 触发器执行完成后,与该触发器相关的这两个表也被删除。
  • Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。
  • Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。
GO
INSERT INTO Student (number,name) VALUES (1807,'角色');

深度解析使用序列以及Inserted表

USE [OSMP]
BEGIN
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'Person')
AND NOT EXISTS (select * from Person) --这条语句的意思是当表存在并且不为空是执行下面的语句 ,and对应&&,or 对应||
DROP table Person
END
GO
CREATE TABLE Person
(
num int,
S_score int,
S_name NVARCHAR(64),
primary key (num)
)
BEGIN
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'Student')
AND NOT EXISTS (select * from Student)
DROP table Student
END
GO
CREATE TABLE Student
(
score int,
name NVARCHAR(64),
primary key (name)
)
--创建序列
BEGIN
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'Student_SEQ')
DROP SEQUENCE Student_SEQ
END
CREATE SEQUENCE Student_SEQ
MINVALUE 1
MAXVALUE 999999999999
START WITH 1
INCREMENT BY 1
CACHE 20; GO
BEGIN
IF (object_id('WMY', 'tr') is not null)
DROP trigger WMY
END;
GO
CREATE TRIGGER WMY
ON Student
instead of INSERT
AS
BEGIN
    Insert into Person (num,S_score,S_name)select next value for Student_SEQ,score,name from Inserted 
    --Insert into Person (num,S_score,S_name)select next value for Student_SEQ,a.* from Inserted a --简化写法
--Insert into Person select next value for Student_SEQ,* from Inserted
    --此处并无意思主要用于理解,执行下面的Student插入语句是,数据库维护了一个与Student数据结构一样的表Inserted,
--这里利用这个表和序列值来为Person做插入,而实际上没有执行Student插入,如果想要Student也执行把Instead of 改为for或after
END;
GO
Insert into Student(score,name) values('1','m');

插曲获取序列的当前值

GO
SELECT current_value FROM sys.sequences WHERE name = 'Student_SEQ'

sql server定义变量以及变量赋值

DECLARE @index VARCHAR(20),@Orderindex VARCHAR(20);
select @index=next value for ENTITY_SEQ;
select @Orderindex= 'R_'+rtrim(ltrim(right(cast('00000000'+rtrim(cast(@index as int)) as varchar(20)),10)))

  

Oracle 触发器与SQL server类似,在此只显示代码

new是新插入的数据,old是原来的数据

insert只会有new,代表着要插入的新记录

delete只会有old,代表着要删除的记录

update由于执行的是先删除旧的记录,再插入新的记录,因此new和old都会有,且含义与上面的相同
注:update触发器,可根据具体需求选择记录旧记录还是新记录。

  *这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;

  * for each row 指定触发器每行触发一次

BEGIN
EXECUTE IMMEDIATE 'DROP TABLE Person';
EXCEPTION WHEN OTHERS THEN NULL;
END; CREATE TABLE Person
(
num INTEGER
S_score INTEGER,
S_name NVARCHAR2(64),
primary key (num)
)
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE Student';
EXCEPTION WHEN OTHERS THEN NULL;
END; CREATE TABLE Student
(
score INTEGER,
name NVARCHAR2(64),
primary key (name)
)
--创建序列
BEGIN
EXECUTE IMMEDIATE 'DROP SEQUENCE Student_SEQ';
EXCEPTION WHEN OTHERS THEN NULL;
END;
CREATE SEQUENCE Student_SEQ
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20;
CREATE OR REPLACE TRIGGER TR_INST_DEVICE
BEFORE INSERT ON M_DEVICEENTITY
FOR EACH ROW BEGIN
select Student_SEQ.NEXTVAL into :new.num from dual;
--select 'A' || trim(to_char(:new.num, '00000000')) into :new.score from dual;
--这个两语句作用并无练习,第一个取出序列的下一个值插入new表中(new表类似SQL server 中的Inserted)
--更改score的标示发以A_0000001为样式,这个语句只做参考在此处无用也运行不了(因为表的字段类型)
END;
GO
Insert into Student(score,name) values('1','m')

 Intert into Select值与表组合的表示方法

Insert into Person(n, num, name) select next value for ENTITY_SEQ,number,name from Student where number=114;
--next value for ENTITY_SEQ序列与select字段组合添加
Insert into Person(n, num, name) select cast(100 as int),number,name from Student where number=114;
--cast(100 as int)值与字段组合添加

 C# 中Oracle分页写法 end,start为传入的数值,

 cmd.CommandText = @"SELECT * FROM (SELECT ROWNUM AS rowno, t.*  FROM  '+tablename +' t
WHERE ROWNUM <= '" + end + "') table_alias WHERE table_alias.rowno >= '" + start + "'";

 

   cmd.CommandText = @"select * from M_ORDERHANDLE where ORDERINDEX  = '" + orderindex + "'";

  

SELECT *
FROM (SELECT ROWNUM AS rowno, t.*
FROM emp t
WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
AND TO_DATE ('20060731', 'yyyymmdd')
AND ROWNUM <= 20) table_alias
WHERE table_alias.rowno >= 10;

  

SELECT * FROM (SELECT * FROM M_ALARM ) WHERE ROWNUM <=500  ORDER BY ROWNUM Desc;

  

--Oracle环境下的时间比对语句
SELECT * FROM M_WORKORDER where CREATETIME >= to_date('2015/03/23','yyyy-mm-dd hh24:mi:ss') and
CREATETIME <= to_date('2016/03/23','yyyy-mm-dd hh24:mi:ss') SELECT * FROM M_WORKORDER where to_char(CREATETIME, 'yyyy-mm-dd hh24:mi:ss') >= '2015-03-01 00:00:00' and
to_char(CREATETIME, 'yyyy-mm-dd hh24:mi:ss') <= '2016-04-05 00:00:00'
--注意时间格式转换为一致

  

//Oracle多表连接查询
string sql = @"SELECT W.*, D.*, AH.*, A.ALARMDESCRIPTION, A.DETECTTIME, A.ALARMPHENOMENON, A.ENTITYTYPE
FROM M_WORKORDER W, M_ALARM A,
(SELECT * FROM
(SELECT ROW_NUMBER() OVER (PARTITION BY H.ALARMINDEX ORDER BY H.HANDLETIME DESC) N,
H.* FROM M_ALARMHANDLE H)
WHERE N = 1) AH,
(SELECT * FROM M_CONFIGITEMRELATION C, M_BUSINESSENTITY B
WHERE C.TARGETINDEX = B.ENTITYINDEX AND C.GROUPTYPE = 1) D
WHERE W.ALARMINDEX = D.SOURCEINDEX(+) AND W.ALARMINDEX = AH.ALARMINDEX(+) AND
A.ALARMINDEX = W.ALARMINDEX AND
to_char(CREATETIME, 'yyyy-mm-dd') >= '" + Convert.ToDateTime(StartTime).ToString("yyyy-MM-dd") + "' and
to_char(CREATETIME, 'yyyy-mm-dd') <= '" + Convert.ToDateTime(EndTime).ToString("yyyy-MM-dd") + "' and rownum<20";

  注意 (+)左右边对应的是左右连接,

//SQL server 对应的多表连接查询
string sql = @"SELECT W.*, D.*, AH.*, A.ALARMDESCRIPTION, A.DETECTTIME, A.ALARMPHENOMENON, A.ENTITYTYPE
FROM M_ALARM A,M_WORKORDER W LEFT JOIN
(SELECT * FROM
(SELECT ROW_NUMBER() OVER (PARTITION BY H.ALARMINDEX ORDER BY H.HANDLETIME DESC) N,
H.* FROM M_ALARMHANDLE H) M
WHERE M.N=1)AH on W.ALARMINDEX = AH.ALARMINDEX
LEFT JOIN
(SELECT * FROM M_CONFIGITEMRELATION C, M_BUSINESSENTITY B
WHERE C.TARGETINDEX = B.ENTITYINDEX AND C.GROUPTYPE = 1)D ON W.ALARMINDEX = D.SOURCEINDEX
WHERE A.ALARMINDEX = W.ALARMINDEX and CONVERT(varchar(100),w.createtime, 20) >= '" +
Convert.ToDateTime(StartTime).ToString("yyyy-MM-dd") + "' and
CONVERT(varchar(100),w.createtime, 20) <= '" + Convert.ToDateTime(EndTime).ToString("yyyy-MM-dd") + "'";

SQL server Select Into用法详解

http://wenku.baidu.com/link?url=I7DrdMzq7-ONDePwrmkHJjofYiS1KL6kyT9pzVcLvz4g0eSxoKH0lvfJYtEcJhxgsfVrB9uHokJRHjHC43kj6sxN5bVCQUoSh-B-IB5tQHC

SQL server 触发器里面判断是什么引发的触发

http://www.2cto.com/database/201308/238647.html

 

SQL server与Oracle触发器的创建与使用的更多相关文章

  1. sql server 类oracle vm_contact() 函数创建

    CREATE FUNCTION dbo.fun_orgname(@id int)RETURNS varchar(8000)AS BEGIN      DECLARE @str varchar(8000 ...

  2. SQL Server 存储过程、触发器、游标

    存储过程 1.存储过程是事先编好的.存储在数据库中的程序,这些程序用来完成对数据库的指定操作. 2.系统存储过程: SQL Server本身提供了一些存储过程,用于管理有关数据库和用户的信息. 用户存 ...

  3. asp.net 开发 sql server 转 oracle

    前段时间我们公司项目 要把sql server 转oracle 分享一下心得 也记录一下问题 开始我研究了一段时间 然后下载了 oracle 11g 版本 和 PL/SQL(客户端) 和sql ser ...

  4. SQL SERVER与ORACLE的几点区别

    1.数据类型不同.      sql server 的数据类型 int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatet ...

  5. SQL Server,MySQL,Oracle三者的区别

    SQL Server,MySQL,Oracle三者的区别 2016-10-14 转自:SQL Server,MySQL,Oracle三者的区别 目录 1 Oracle.Sql Server.MySql ...

  6. sql server 与 oracle的区别(转)

    --1.数据类型不同.      --sql server 的数据类型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalld ...

  7. SQL Server封闭掉 触发器递归

    SQL Server关闭掉 触发器递归SQL Server  是有一个开关, 可以关闭掉 触发器递归的.EXEC sp_dboption '数据库名字', 'recursive triggers', ...

  8. Win7 64位下sql server链接oracle的方法

    继上一次mysql同步sql server后,这一次需要将Oracle同步到sql server上来,方案相似,只是在sql server链接oracle的时候费了很多时间. 一.测试环境 本方案实现 ...

  9. SQL Server 中的触发器(trigger)

    SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 ...

随机推荐

  1. Spring、基本类型属性和集合类型属性的注入

    Spring 还可以对基本属性和集合类型属性进行注入: public interface PersonIService { public String getBaseProperty(); publi ...

  2. Dreamweaver PHP代码护眼配色方案

    结果展示 [1]主菜单选择编辑->首选项.在分类中选择"字体".设置代码视图的字体为Courier New [2]在分类中选择 "代码颜色",点击 &qu ...

  3. Boost环境配置及遇到的问题解决方案

    1.模块/工具简介 Boost库是一个跨平台,开源并且完全免费的C++库,内容涵盖字符串处理.正则表达式.容器与数据结构.并发编程.函数式编程.泛型编程.设计模式实现等许多领域,使得实际的开发更加灵活 ...

  4. ASP.NET MVC 学习之路-2

    本文在于巩固基础 为了方便理解MVC框架,我们先创建空的ASP.NET MVC模板 下面是创建后的项目结构 每个文件或者文件夹的作用 App_Data 应用程序数据--- 顾名思义是放置文件或者数据库 ...

  5. C语言队列的实现

    队列是常用的数据结构之一,下面给出一个链式队列的实现: 头文件Queue.h #ifndef Queue_H #define Queue_H typedef int Item; typedef str ...

  6. 初识JavaScript,感觉整个人都不好了。。。

    学习web前端的开发已经将近一个月了,开发中的三个大兄弟——“html”.“css”.“JavaScript”,小哥我已经深入接触了前两位,并与他俩建立的深厚的友谊.在编写过程中,不能说达到各位大神的 ...

  7. composer时间长了,提示需要升级,结果问题来了

    今天重新开始之前的laravel项目,结果composer提示需要升级,于是 composer selfupdate 结果提示无法连接目标库,查阅composer官网,发现之前的库地址已经启用了ssl ...

  8. 【Chromium中文文档】安全浏览 -- Chrome中的警告都是怎么来的?

    安全浏览 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/SafeBrow ...

  9. Linux 安装xtrabackup的依赖问题

    问题: 尝试安装xtrabackup rpm -ivh percona-xtrabackup-2.2.11-1.el7.x86_64.rpm 报错 perl(DBD::mysql) 被 percona ...

  10. openssl编译(VC6.0)

    官网:http://www.openssl.org/ 得到源码: git clone  https://github.com/openssl/openssl 一.用vc编译器编译: 1.下载nasm: ...