文档库 最新最全的文档下载
当前位置:文档库 › sqlserver触发器的使用情况

sqlserver触发器的使用情况

sqlserver触发器的使用情况
sqlserver触发器的使用情况

何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程

定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。

常见的触发器有三种:分别应用于Insert , Update , Delete 事件。

我为什么要使用触发器?比如,这么两个表:

代码如下:

Create Table Student( --学生表

StudentID int primary key, --学号

....

)

Create Table BorrowRecord( --学生借书记录表

BorrowRecord int identity(1,1), --流水号

StudentID int , --学号

BorrowDate datetime, --借出时间

ReturnDAte Datetime, --归还时间

...

)

用到的功能有:

1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);

2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

等等。

这时候可以用到触发器。对于1,创建一个Update触发器:

代码如下:

Create Trigger truStudent

On Student --在Student表中创建触发器

for Update --为什么事件触发

As --事件触发后所要做的事情

if Update(StudentID)

begin

Update BorrowRecord

Set StudentID=i.StudentID

From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表

Where br.StudentID=d.StudentID

end

理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。

一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:

虚拟表Inserted 虚拟表Deleted

在表记录新增时存放新增的记录不存储记录

修改时存放用来更新的新记录存放更新前的记录

删除时不存储记录存放被删除的记录

一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删

除Student记录并写入新纪录。

对于2,创建一个Delete触发器

代码如下:

Create trigger trdStudent

On Student

for Delete

As

Delete BorrowRecord

From BorrowRecord br , Delted d

Where br.StudentID=d.StudentID

从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。

SQL触发器实例2

代码如下:

/*

建立虚拟测试环境,包含:表[卷烟库存表],表[卷烟销售表]。

请大家注意跟踪这两个表的数据,体会触发器到底执行了什么业务逻辑,对数据有什么影响。

为了能更清晰的表述触发器的作用,表结构存在数据冗余,且不符合第三范式,这里特此说明。*/

USE Master

GO

IF EX ISTS (SELECT NAME FROM SYSOBJECTS WHERE X TYPE = 'U' AND NAME = '卷烟库存表')

DROP TABLE 卷烟库存表

GO

IF EX ISTS (SELECT NAME FROM SYSOBJECTS WHERE X TYPE = 'U' AND NAME = '卷烟销售表')

DROP TABLE 卷烟销售表

GO

--业务规则:销售金额= 销售数量* 销售单价业务规则。

CREATE TABLE 卷烟销售表

(

卷烟品牌VARCHAR(40) PRIMARY KEY NOT NULL,

购货商VARCHAR(40) NULL,

销售数量INT NULL,

销售单价MONEY NULL,

销售金额MONEY NULL

)

GO

--业务规则:库存金额= 库存数量* 库存单价业务规则。

CREATE TABLE 卷烟库存表

(

卷烟品牌VARCHAR(40) PRIMARY KEY NOT NULL,

库存数量INT NULL,

库存单价MONEY NULL,

库存金额MONEY NULL

)

GO

--创建触发器,示例1

/*

创建触发器[T_INSERT_卷烟库存表],这个触发器较简单。

说明:每当[卷烟库存表]发生INSERT 动作,则引发该触发器。

触发器功能:强制执行业务规则,保证插入的数据中,库存金额= 库存数量* 库存单价。

注意:[INSERTED]、[DELETED]为系统表,不可创建、修改、删除,但可以调用。

重要:这两个系统表的结构同插入数据的表的结构。

*/

IF EX ISTS (SELECT NAME FROM SYSOBJECTS WHERE X TYPE = 'TR' AND NAME = 'T _INSERT_卷烟库存表')

DROP TRIGGER T_INSERT_卷烟库存表

GO

CREATE TRIGGER T_INSERT_卷烟库存表

ON 卷烟库存表

FOR INSERT

AS

--提交事务处理

BEGIN TRANSACTION

--强制执行下列语句,保证业务规则

UPDATE 卷烟库存表

SET 库存金额= 库存数量* 库存单价

WHERE 卷烟品牌IN (SELECT 卷烟品牌from INSERTED)

COMMIT TRANSACTION

GO

/*

针对[卷烟库存表],插入测试数据:

注意,第一条数据(红塔山新势力)中的数据符合业务规则,

第二条数据(红塔山人为峰)中,[库存金额]空,不符合业务规则,

第三条数据(云南映像)中,[库存金额]不等于[库存数量]乘以[库存单价],不符合业务规则。第四条数据库存数量为0。

请注意在插入数据后,检查[卷烟库存表]中的数据是否库存金额= 库存数量* 库存单价。*/

INSERT INTO 卷烟库存表(卷烟品牌,库存数量,库存单价,库存金额)

SELECT '红塔山新势力',100,12,1200 UNION ALL

SELECT '红塔山人为峰',100,22,NULL UNION ALL

SELECT '云南映像',100,60,500 UNION ALL

SELECT '玉溪',0,30,0

GO

--查询数据

SELECT * FROM 卷烟库存表

GO

/*

结果集

RecordId 卷烟品牌库存数量库存单价库存金额

-------- ------------ -------- ------- ---------

1 红塔山新势力100 12.0000 1200.0000

2 红塔山人为峰100 22.0000 2200.0000

3 云南映像100 60.0000 6000.0000

4 玉溪0 30.0000 .0000

(所影响的行数为 4 行)

*/

--触发器示例2

代码如下:

/*

创建触发器[T_INSERT_卷烟销售表],该触发器较复杂。

说明: 每当[卷烟库存表]发生INSERT 动作,则引发该触发器。

触发器功能:实现业务规则。

业务规则: 如果销售的卷烟品牌不存在库存或者库存为零,则返回错误。

否则则自动减少[卷烟库存表]中对应品牌卷烟的库存数量和库存金额。

*/

IF EX ISTS (SELECT NAME FROM SYSOBJECTS WHERE X TYPE = 'TR' AND NAME = 'T _INSERT_卷烟销售表')

DROP TRIGGER T_INSERT_卷烟销售表

GO

CREATE TRIGGER T_INSERT_卷烟销售表

ON 卷烟销售表

FOR INSERT

AS

BEGIN TRANSACTION

--检查数据的合法性:销售的卷烟是否有库存,或者库存是否大于零

IF NOT EX ISTS (

SELECT 库存数量

FROM 卷烟库存表

WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED)

)

BEGIN

--返回错误提示

RAISERROR('错误!该卷烟不存在库存,不能销售。',16,1)

--回滚事务

ROLLBACK

RETURN

END

IF EX ISTS (

SELECT 库存数量

FROM 卷烟库存表

WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED) AND 库存数量<= 0

)

BEGIN

--返回错误提示

RAISERROR('错误!该卷烟库存小于等于0,不能销售。',16,1)

--回滚事务

ROLLBACK

RETURN

END

--对合法的数据进行处理

--强制执行下列语句,保证业务规则

UPDATE 卷烟销售表

SET 销售金额= 销售数量* 销售单价

WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED)

DECLARE @卷烟品牌VARCHAR(40)

SET @卷烟品牌= (SELECT 卷烟品牌FROM INSERTED)

DECLARE @销售数量MONEY

SET @销售数量= (SELECT 销售数量FROM INSERTED)

UPDATE 卷烟库存表

SET 库存数量= 库存数量- @销售数量,

库存金额= (库存数量- @销售数量)*库存单价

WHERE 卷烟品牌= @卷烟品牌

COMMIT TRANSACTION

GO

--请大家自行跟踪[卷烟库存表]和[卷烟销售表]的数据变化。

--针对[卷烟销售表],插入第一条测试数据,该数据是正常的。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)

SELECT '红塔山新势力','某购货商',10,12,1200

GO

--针对[卷烟销售表],插入第二条测试数据,该数据销售金额不等于销售单价* 销售数量。--触发器将自动更正数据,使销售金额等于销售单价* 销售数量。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)

SELECT '红塔山人为峰','某购货商',10,22,2000

GO

--针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在卷烟库存表中找不到对应。--触发器将报错。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)

SELECT '红河V8','某购货商',10,60,600

GO

/*

结果集

服务器: 消息50000,级别16,状态1,过程T_INSERT_卷烟销售表,行15

错误!该卷烟不存在库存,不能销售。

*/

--针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在卷烟库存表中库存为0。

--触发器将报错。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)

SELECT '玉溪','某购货商',10,30,300

GO

/*

结果集

服务器: 消息50000,级别16,状态1,过程T_INSERT_卷烟销售表,行29

错误!该卷烟库存小于等于0,不能销售。

*/

--查询数据

SELECT * FROM 卷烟库存表

SELECT * FROM 卷烟销售表

GO

/*

补充:

1、本示例主要通过一个简单的业务规则实现来进行触发器使用的说明,具体的要根据需要灵活处理;

2、关于触发器要理解并运用好INSERTED ,DELETED 两个系统表;

3、本示例创建的触发器都是FOR INSERT ,具体的语法可参考:

Trigger语法

代码如下:

CREATE TRIGGER trigger_name

ON { table | view }

[ WITH ENCRYPTION ] --用于加密触发器

{

{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] } [ WITH APPEND ]

[ NOT FOR REPLICATION ]

AS

[ { IF UPDATE ( column )

[ { AND | OR } UPDATE ( column ) ]

[ ...n ]

| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ]

} ]

sql_statement [ ...n ]

}

}

4、关于触发器,还应该注意

(1)、DELETE 触发器不能捕获TRUNCATE TABLE 语句。

(2)、触发器中不允许以下Transact-SQL 语句:

ALTER DATABASE CREATE DATABASE DISK INIT

DISK RESIZE DROP DATABASE LOAD DATABASE

LOAD LOG RECONFIGURE RESTORE DATABASE

RESTORE LOG

(3)、触发器最多可以嵌套32 层。

*/

--修改触发器

--实质上,是将CREATE TRIGGER ... 修改为ALTER TRIGGER ...即可。

--删除触发器

DROP TRIGGER xxx

GO

--删除测试环境

DROP TABLE 卷烟库存表

GO

DROP TABLE 卷烟销售表

GO

DROP TRIGGER T_INSERT_卷烟库存表

GO

DROP TRIGGER T_INSERT_卷烟销售表

GO

################################################################## 触发器的基础知识和例子

:create trigger tr_name

on table/view

{for | after | instead of} [update][,][insert][,][delete]

[with encryption]

as {batch | if update (col_name) [{and|or} update (col_name)] }

说明:

1 tr_name :触发器名称

2 on table/view :触发器所作用的表。一个触发器只能作用于一个表

3 for 和after :同义

4 after 与instead of :sql 2000新增项目afrer 与instead of 的区别

After

在触发事件发生以后才被激活,只可以建立在表上

Instead of

代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上

5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一

6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。此外,因为delete 操作只对行有影响,

所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。

7 触发器执行时用到的两个特殊表:deleted ,inserted

deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一

样的,只是存放的数据有差异。

下面表格说明deleted 与inserted 数据的差异

deleted 与inserted 数据的差异

Inserted

存放进行insert和update 操作后的数据

Deleted

存放进行delete 和update操作前的数据

注意:update 操作相当于先进行delete 再进行insert ,所以在进行update操作时,修改前的数据拷贝一条到deleted 表中,修改后

的数据在存到触发器作用的表的同时,也同时生成一条拷贝到insered表中

SQL Server 2000中的触发器使用

触发器是数据库应用中的重用工具,它的应用很广泛。这几天写一个化学数据统计方面的软件,需要根据采样,自动计算方差,在这里,我使用了触发器。

下面我摘录了SQL Server官方教程中的一段关于触发器的文字,确实有用的一点文字描述。

可以定义一个无论何时用INSERT语句向表中插入数据时都会执行的触发器。

当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。inserted表包含了INSERT语句中已记录的插入动作。inserted表还允许引用由初始化INSERT语句而产生的日志数据。触发器通过检查inserted表来确定是否执行触发器动作或如何执行它。inserted表中的行总是触发器表中一行或多行的副本。

日志记录了所有修改数据的动作(INSERT、UPDATE和DELETE语句),但在事务日志中的信息是不可读的。然而,inserted表允许你引用由INSERT语句引起的日志变化,这样就可以将插入数据与发生的变化进行比较,来验证它们或采取进一步的动作。也可以直接引用插入的数据,而不必将它们存储到变量中。

示例

在本例中,将创建一个触发器。无论何时订购产品(无论何时向Order Details表中插入一条记

录),这个触发器都将更新Products表中的一列(UnitsInStock)。用原来的值减去订购的数量值即为新值。

代码如下:

USE Northwind

CREATE TRIGGER OrdDet_Insert

ON [Order Details]

FOR INSERT

AS

UPDATE P SET

UnitsInStock = P.UnitsInStock –I.Quantity

FROM Products AS P INNER JOIN Inserted AS I

ON P.ProductID = I.ProductID

DELETE触发器的工作过程

当触发DELETE触发器后,从受影响的表中删除的行将被放置到一个特殊的deleted表中。del eted表是一个逻辑表,它保留已被删除数据行的一个副本。deleted表还允许引用由初始化DELETE 语句产生的日志数据。

使用DELETE触发器时,需要考虑以下的事项和原则:

·当某行被添加到deleted表中时,它就不再存在于数据库表中;因此,deleted表和数据库表没有相同的行。

·创建deleted表时,空间是从内存中分配的。deleted表总是被存储在高速缓存中。

·为DELETE动作定义的触发器并不执行TRUNCATE TABLE语句,原因在于日志不记录TRU NCATE TABLE语句。

示例

在本例中,将创建一个触发器,无论何时删除一个产品类别(即从Categories表中删除一条记录),该触发器都会更新Products表中的Discontinued列。所有受影响的产品都标记为1,标示不再使用这些产品了。

代码如下:

USE Northwind

CREATE TRIGGER Category_Delete

ON Categories

FOR DELETE

AS

UPDATE P SET Discontinued = 1

FROM Products AS P INNER JOIN deleted AS d

ON P.CategoryID = d.CategoryID

UPDATE触发器的工作过程

可将UPDATE语句看成两步操作:即捕获数据前像(before image)的DELETE语句,和捕获数据后像(after image)的INSERT语句。当在定义有触发器的表上执行UPDATE语句时,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。

触发器检查deleted表和inserted表以及被更新的表,来确定是否更新了多行以及如何执行触发器动作。

可以使用IF UPDATE语句定义一个监视指定列的数据更新的触发器。这样,就可以让触发器容易的隔离出特定列的活动。当它检测到指定列已经更新时,触发器就会进一步执行适当的动作,例如发出错误信息指出该列不能更新,或者根据新的更新的列值执行一系列的动作语句。

语法

IF UPDATE ()

例1

本例阻止用户修改Employees表中的EmployeeID列。

代码如下:

USE Northwind

GO

CREATE TRIGGER Employee_Update

ON Employees

FOR UPDATE

AS

IF UPDATE (EmployeeID)

BEGIN

RAISERROR ('Transaction cannot be processed.\

***** Employee ID number cannot be modified.', 10, 1)

ROLLBACK TRANSACTION

END

INSTEAD OF触发器的工作过程

可以在表或视图上指定INSTEAD OF触发器。执行这种触发器就能够替代原始的触发动作。IN STEAD OF触发器扩展了视图更新的类型。对于每一种触发动作(INSERT、UPDATE或DELETE),每一个表或视图只能有一个INSTEAD OF触发器。

INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。例如,通常不能在一个基于连接的视图上进行DELETE操作。然而,可以编写一个INSTEAD OF DELETE触发器来实现删除。上述触发器可以访问那些如果视图是一个真正的表时已经被删除的数据行。将被删除的行存储在一个名为deleted的工作表中,就像AFTER触发器一样。相似地,在UPDATE INSTEAD OF 触发器或者INSERT INSTEAD OF触发器中,你可以访问inserted表中的新行。

不能在带有WITH CHECK OPTION定义的视图中创建INSTEAD OF触发器。

示例

在本例中,创建了一个德国客户表和一个墨西哥客户表。放置在视图上的INSTEAD OF触发器将把更新操作重新定向到适当的基表上。这时发生的插入是对CustomersGer表的插入而不是对视图的插入。

创建两个包含客户数据的表:

代码如下:

SELECT * INTO CustomersGer FROM Customers WHERE Customers.Country = 'Germany'

SELECT * INTO CustomersMex FROM Customers WHERE Customers.Country = 'Mexico' GO

在该数据上创建视图:

代码如下:

CREATE VIEW CustomersView AS

SELECT * FROM CustomersGer

UNION

SELECT * FROM CustomersMex

GO

创建一个在上述视图上的INSTEAD OF触发器:

代码如下:

CREATE TRIGGER Customers_Update2

ON CustomersView

INSTEAD OF UPDATE AS

DECLARE @Country nvarchar(15)

SET @Country = (SELECT Country FROM Inserted) IF @Country = 'Germany'

BEGIN

UPDATE CustomersGer

SET CustomersGer.Phone = Inserted.Phone

FROM CustomersGer JOIN Inserted

ON CustomersGer.CustomerID = Inserted.CustomerID END

ELSE

IF @Country = 'Mexico'

BEGIN

UPDATE CustomersMex

SET CustomersMex.Phone = Inserted.Phone

FROM CustomersMex JOIN Inserted

ON CustomersMex.CustomerID = Inserted.CustomerID END

通过更新视图,测试触发器:

代码如下:

SQLSERVER操作命令

SQLSERVER数据库操作 ******操作前,请确定SQL的服务已经开启******** 一:登录进入sql数据库 1、开始---所有程序---Microsoft SQL Server 2005---SQL Server Management Studio Express 2、此时出现“连接到服务器”的对话框, “服务器名称”设置为SQL数据库所在机器的IP地址 “身份验证”设置为SQL Server身份验证或者Windows 身份验证 填写登录名和密码后,点击“连接”按钮,即可进入到SQL数据库操作界面。 二:新建数据库 登录进去后,右击“数据库”,选择—“新建数据库” 设置数据库名称,在下面的选项卡中还可以设置数据库的初始大小,自动增长,路径。 点击确定,一个数据库就建好了。 三:如何备份的数据库文件。 登录进入后,右击相应的需要备份数据库----选择“任务” 目标下的备份到,点击“添加”按钮可以设置备份数据库保存的路径。 四:如何还原备份的数据库文件。(以本地机器为例子) 1、设置服务器名称,点击右边的下拉框的三角,选择“浏览更多…”。 此时出现查找服务器对话框,选择“本地服务器”---点开“数据库引擎”前面 的三角---选中出现的服务器名称—确定。 (注:可以在“网络服务器”选项卡中设置网络服务器) 2、设置身份验证,选择为“windows身份验证” 3、点击连接按钮,进入数据库管理页面 4、右击“数据库”,选择“还原数据库”,出现还原数据库的对话框 还原的目标----目标数据库,这里设置数据库的名字 还原的源----选择“源设备”,在弹出的对话框中点击“添加”按钮,找到所备 份的数据库文件,确定。 5、此时,在还原数据库对话框中会出现所还原的数据库的信息。在前面选中所需还 原的数据库。确定。 6、为刚刚还原的数据库设置相应的用户。 a点开“安全性”---右击“登录名”---新建登录名 b 设置登录名(假如为admin),并设置为SQL Server身份验证,输入密码,去除 “强制实施密码策略”前的勾。 C 找到导入的数据库,右击此数据库----选择“属性”,在选择页中,点击“文件” 设置所有者,点击右边的按钮,选择“浏览”,找到相应的用户(如admin)。确 定。。 7、此时重新以admin的身份进入,就可操作相应的数据库。

触发器实验报告

实验3 触发器及其应用 一、实验目的 1、掌握基本RS、JK、D和T触发器的逻辑功能 2、掌握集成触发器的逻辑功能及使用方法 3、熟悉触发器之间相互转换的方法 二、实验原理 触发器具有两个稳定状态,用以表示逻辑状态“1”和“0”,在一定的外界信号作用下,可以从一个稳定状态翻转到另一个稳定状态,它是一个具有记忆功能的二进制信息存贮器件,是构成各种时序电路的最基本逻辑单元。 1、基本RS触发器 图5-8-1为由两个与非门交叉耦合构成的基本RS触发器,它是无时钟控制低电平直接触发的触发器。基本RS触发器具有置“0”、置“1”和“保持”三种功能。通常称S为置“1”端,因为S=0(R=1)时触发器被置“1”;R为置“0”端,因为R=0(S=1)时触发器被置“0”,当S=R=1时状态保持;S=R=0时,触发器状态不定,应避免此 种情况发生,表5-8-1为基本RS触发器的功能表。 基本RS触发器。也可以用两个“或非门”组成,此时为高电平触发有效。 表5-8-1 图5—8—1 基本RS触发器 2、JK触发器 在输入信号为双端的情况下,JK触发器是功能完善、使用灵活和通用性较强的一种触发器。本实验采用74LS112双JK触发器,是下降边沿触发的边沿触发器。引脚功能及逻辑符号如图5-8-2所示。 JK触发器的状态方程为 Q n+1=J Q n+K Q n J和K是数据输入端,是触发器状态更新的依据,若J、K有两个或两个以上输入端时,组

成“与”的关系。Q与Q为两个互补输出端。通常把Q=0、Q=1的状态定为触发器“0”状态;而把Q=1,Q=0定为“1”状态。 图5-8-2 74LS112双JK触发器引脚排列及逻辑符号 下降沿触发JK触发器的功能如表5-8-2 表 注:×—任意态↓—高到低电平跳变↑—低到高电平跳变 Q n(Q n)—现态Q n+1(Q n+1 )—次态φ—不定态 JK触发器常被用作缓冲存储器,移位寄存器和计数器。 3、D触发器 在输入信号为单端的情况下,D触发器用起来最为方便,其状态方程为 Q n+1=D n,其输出状态的更新发生在CP脉冲的上升沿,故又称为上升沿触发的边沿触发器, 触发器的状态只取决于时钟到来前D端的状态,D触发器的应用很广,可用作数字信号的寄存,移位寄存,分频和波形发生等。有很多种型号可供各种用途的需要而选用。如双 D 74LS74、四D 74LS175、六D 74LS174等。 图5-8-3 为双D 74LS74的引脚排列及逻辑符号。功能如表5-8-3。

mysql触发器异常处理

MySQL触发器异常处理 MySQL触发器更新本表数据异常:Can't update table 'tbl' in stored function/trigger because it is already used by statement which invoked this 如果你在触发器里面对刚刚插入的数据进行了 insert/update, 则出现这个问题。因为会造 成循环的调用. create trigger test before update on test for each row update test set NEW.updateTime = NOW() where id=NEW.ID; END 应该使用set操作,而不是在触发器里使用 update,比如 create trigger test before update on test for each row set NEW.updateTime = NOW(); END MySQL触发器执行复合语句 触发器1.自增表中商品分类编码值+1,添加商品分类前给商品分类编码属性赋其对应的自 增表中的值 CREATE TRIGGER trigger1 BEFORE INSERT ON dw_base_commodity_category_info FOR EACH ROW BEGIN UPDATE sequence SET current_value=current_value+1 WHERE `name`='dw_base_commodity_category_info'; SET NEW.code=(SELECT current_value FROM sequence WHERE `name`='dw_base_commodity_category_info'); END; 删除触发器1:DROP TRIGGER trigger1; 触发器2.自增表中商品编码值+1,添加商品前给商品编码属性赋其对应的自增表中的值 CREATE TRIGGER trigger2 BEFORE INSERT ON dw_commodity_fact_info

触发器实验报告

. . . . .. . 实验报告 课程名称:数字电子技术基础实验 指导老师: 周箭 成绩:__________________ 实验名称:集成触发器应用 实验类型: 同组学生姓名:__邓江毅_____ 一、实验目的和要求(必填) 二、实验内容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与分析(必填) 七、讨论、心得 实验内容和原理 1、D →J-K 的转换实验 设计过程:J-K 触发器和D 触发器的次态方程如下: J-K 触发器:n n 1 +n Q Q J =Q K +, D 触发器:Qn+1=D 若将D 触发器转换为J-K 触发器,则有:n n Q Q J =D K +。 实验结果: J K Qn-1 Qn 功能 0 0 0 0 保持 1 1 0 1 0 0 置0 1 0 1 1 0 1 翻转 1 0 1 0 1 置1 1 1 (上:Qn ,下:CP ,J 为高电平时) 2、D 触发器转换为T ’触发器实验 设计过程:D 触发器和T ’触发器的次态方程如下: D 触发器:Q n+1= D , T ’触发器:Q n+1=!Q n 若将D 触发器转换为T ’触发器,则二者的次态方程须相等,因此有:D=!Qn 。 实验截图: 专业:电卓1501 姓名:卢倚平 学号:3150101215 日期:2017.6.01 地点:东三404

实验名称:集成触发器应用实验 姓名: 卢倚平 学号: 2 (上:Qn ,下:!Qn )CP 为1024Hz 的脉冲。 3、J-K →D 的转换实验。 ①设计过程: J-K 触发器:n n 1 +n Q Q J =Q K +, D 触发器:Qn+1=D 若将J-K 触发器转换为D 触发器,则二者的次态方程须相等,因此有:J=D ,K=!D 。 实验截图: (上:Qn ,下:CP ) (上:Qn ,下:D ) 4、J-K →T ′的转换实验。 设计过程: J-K 触发器:n n 1 +n Q Q J =Q K +, T ’触发器:Qn+1=!Qn 若将J-K 触发器转换为T ’触发器,则二者的次态方程须相等,因此有:J=K=1 实验截图:

sqlserver_SQL触发器的使用及语法

定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器?比如,这么两个表: Create Table Student(--学生表StudentID int primary key,--学号.... ) Create T able BorrowRecord(--学生借书记录表BorrowRecord int identity(1,1),--流水号StudentID int ,--学号BorrowDate datetime,--借出时间ReturnDAte Datetime,--归还时间... ) 用到的功能有: 1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号); 2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。等等。 这时候可以用到触发器。对于1,创建一个Update触发器: Create Trigger truStudent On Student--在Student表中创建触发器for Update--为什么事件触发As --事件触发后所要做的事情 if Update(StudentID) begin Update BorrowRecord Set StudentID=i.StudentID

From BorrowRecord br , Deleted d ,Inserted i--Deleted和Inserted临时表Where br.StudentID=d.StudentID end 理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:虚拟表Inserted虚拟表Deleted 在表记录新增时存放新增的记录不存储记录修改时存放用来更新的新记录存放更新前的记录删除时不存储记录存放被删除的记录 一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。 对于2,创建一个Delete触发器Create trigger trdStudent On Student for Delete As Delete BorrowRecord From BorrowRecord br , Delted d Where br.StudentID=d.StudentID 从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。SQL触发器实例2 USE Master GO

mysql设置触发器权限问题的解决方法

本文实例讲述了mysql设置触发器权限的方法,针对权限错误的情况非常实用。具体分析如下: mysql导入数据提示没有super privilege权限处理,如下所示: 1 error 1419 (hy000): you do not have the super privilege and binary logging is enabled 导入function 、trigger 到mysql database,报错: 1 you do not have the super privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)”. 原因: function / trigger 中有dangerous statements修改数据库,错误只在启用binary logging选项进行主从复制的服务器上出现。 解决方法如下: 1)导入数据的用户不仅需要create routine, alter routine, create trigger, alter trigger, create function 和alter function 权限,还需要super privileges 权限,使用超级用户导入数据。 2)让所有用户具有执行类似functions的权限,危险,不推荐, 123 o by specifying it on the server start, like: –log-bin-trust-function-creators=1 o by setting it to 1 through the set global statement, like: mysql> set global log_bin_trust_function_creators = 1; 3)如果不需要复制,或者是从库,关闭binlog, 1234 # binary logging –not required for slaves, but recommended #log-bin=mysql-bin # binary logging format –mixed recommended #binlog_format=mixed 希望本文所述对大家的mysql数据库设计有所帮助。 更多信息请查看IT技术专栏

数电实验触发器及其应用

数电实验触发器及其应用 数字电子技术实验报告 实验三: 触发器及其应用 一、实验目的: 1、熟悉基本RS触发器,D触发器的功能测试。 2、了解触发器的两种触发方式(脉冲电平触发和脉冲边沿触发)及触发特点 3、熟悉触发器的实际应用。 二、实验设备: 1 、数字电路实验箱; 2、数字双综示波器; 3、指示灯; 4、74LS00、74LS74。 三、实验原理: 1、触发器是一个具有记忆功能的二进制信息存储器件,是构成多种时序 电路的最基本逻辑单元,也是数字逻辑电路中一种重要的单元电路。在数字系统和计算机中有着广泛的应用。触发器具有两个稳定状态,即“0”和“ 1 ”,在一定的外界信号作用下,可以从一个稳定状态翻转到另一个稳定状态。触发器有集成触发器和门电路(主要是“与非门” )组成的触发器。 按其功能可分为有RS触发器、JK触发器、D触发器、T功能等触发器。触发方式有电平触发和边沿触发两种。 2、基本RS触发器是最基本的触发器,可由两个与非门交叉耦合构成。 基本RS触发器具有置“ 0”、置“ 1”和“保持”三种功能。基本RS触发器

也可以用二个“或非门”组成,此时为高电平触发有效。 3、D触发器在CP的前沿发生翻转,触发器的次态取决于CP脉冲上升沿n+1来到之前D端的状态,即Q = D。因此,它具有置“ 0”和“T两种功能。由于在CP=1期间电路具有阻塞作用,在CP=1期间,D端数据结构变RS化,不会影响触发器的输出状态。和分别是置“ 0”端和置“ 1” DD 端,不需要强迫置“ 0”和置“ 1”时,都应是高电平。74LS74(CC4013, 74LS74(CC4042均为上升沿触发器。以下为74LS74的引脚图和逻辑图。 馬LD 1CP 1云IQ LQ GM) 四、实验原理图和实验结果: 设计实验: 1、一个水塔液位显示控制示意图,虚线表示水位。传感器A、B被水浸沿时

SQLServer触发器的使用

触发器建立的代码 Create Trigger TG_ProjectName On table1 After Update As Update table2 Set[工程名]=b.工程名 from table2 a,inserted b where a.ProjID=b.ID 关于触发器中Inserted和Deleted的解释。 inserted触发器语句中使用了两种特殊的表:deleted 表和inserted 表。Microsoft? SQL Server 2000 自动创建和管理这些表。可以使用这两个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件;然而,不能直接对表中的数据进行更改。 inserted 和deleted 表主要用于触发器中: ◆扩展表间引用完整性。 ◆在以视图为基础的基表中插入或更新数据。 ◆检查错误并基于错误采取行动。 ◆找到数据修改前后表状态的差异,并基于此差异采取行动。 Deleted 表用于存储DELETE 和UPDATE 语句所影响的行的复本。在执行DELETE 或UPDATE 语句时,行从触发器表中删除,并传输到deleted 表中。Deleted 表和触发器表通常没有相同的行。Inserted 表用于存储INSERT 和UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。 更新事务类似于在删除之后执行插入;首先旧行被复制到deleted 表中,然后新行被复制到触发器表和inserted 表中。 在设置触发器条件时,应当为引发触发器的操作恰当使用inserted 和deleted 表。虽然在测试INSERT 时引用deleted 表或在测试DELETE 时引用inserted 表不会引起任何错误,但是在这种情形下这些触发器测试表中不会包含任何行。 说明 如果触发器操作取决于一个数据修改所影响的行数,应该为多行数据修改(基于SELECT 语句的INSERT、DELETE 或UPDATE)使用测试(如检查@@ROWCOUNT),然后采取相应的对策。 SQL Server 2000不允许AFTER 触发器引用inserted 和deleted 表中的text、ntext 或image 列;然而,允许INSTEAD OF 触发器引用这些列。有关更多信息,请参见CREATE TRIGGER。 在INSTEAD OF 触发器中使用inserted 和deleted 表 传递到在表上定义的INSTEAD OF 触发器的inserted 和deleted 表遵从与传递到AFTER 触发器的inserted 和deleted 表相同的规则。inserted 和deleted 表的格式与在其上定义INSTEAD OF 触发器的表的格式相同。inserted 和deleted 表中的每一列都直接映射到基表中的列。 有关引用带INSTEAD OF 触发器的表的INSERT 或UPDATE 语句何时必须提供列值的规则与表没有INSTEAD OF 触发器时相同: 不能为计算列或具有timestamp 数据类型的列指定值。 不能为具有IDENTITY 属性的列指定值,除非该列的IDENTITY_INSERT 为ON。当IDENTITY_INSERT 为ON 时,INSERT 语句必须提供一个值。INSERT 语句必须为所有无DEFAULT 约束的NOT NULL 列提供值。 对于除计算列、标识列或timestamp 列以外的任何列,任何允许空值的列或具有DEFAULT 定义的NOT NULL 列的值都是可选的。

MySQL触发器

MySQL 5.0 触发器 MySQL 5.0 新特性系列 C 第 2 部分 MySQL 技术白皮书 Peter Gulutzan March, 2005 翻译:陈朋奕 毕业于西安电子科技大学 现泛华讯电脑技术 版权说明版权说明::本手册参考之原文本手册参考之原文的版权属的版权属 MySQL AB,而本手册可自由使用而本手册可自由使用、、修改修改、、散发散发、、转载和商业用途转载和商业用途,, 但必须保留译者署名但必须保留译者署名。。由此引发的版权问题由此引发的版权问题,,译者不负责任译者不负责任。。(btw :可能会有错别字或错误可能会有错别字或错误,,但不影响阅读但不影响阅读)) Cop yright 2005, MySQL AB

Table of Contents Introduction (3) Conventions and Styles (3) Why Triggers (3) 1. Syntax: Name (4) 2. Syntax: Time (5) 3. Syntax: Event (5) 4. Syntax: Table (5) 5. Syntax: Granularity (5) 6. Syntax: Statement (6) Privileges (6) Referring to OLD and NEW columns (6) Example of CREATE and INSERT (7) Example of a "check" constraint (7) Conclusion (9) About MySQL (9) Copyri ght 2005, MySQL AB Page 2

实验四 触发器 实验报告

实验四触发器实验报告 徐旭东 11180243 物理112班 一、实验目的 1. 熟悉并掌握R-S、D、J-K触发器的特性和功能测试方法。 2. 学会正确使用触发器集成芯片。 3. 了解不同逻辑功能FF相互转换的方法。 二、实验仪器及材料 1. 实验仪器设备:双踪示波器、数字万用表、数字电路实验箱 2. 器件 74LS00 二输入端四与非门 1片 74LS74 双D触发器 1片 74LS76 双J-K触发器 1片 三、实验内容步骤及记录 1. 基本RS触发器功能测试: 两个TTL与非门首尾相接构成的基本RS触发器的电路。如图5.1所示。

(1)试按下面的顺序在S R 端加信号: d S =0 d R =1 d S =1 d R =1 d S =1 d R =0 d S =1 d R =1 观察并记录触发器的Q 、Q _ 端的状态,将结果填入 下表4.1中,并说明在上述各种输入状态下,RS 执行的是什么逻辑功能? 表4.1 d S d R Q 逻辑功能 0 1 1 1 1 1 0 1 1 1 0 0 0 0 1 1 置1 保持 置0 保持 (2)当d S 、d R 都接低电平时,观察Q 、Q _ 端的状态,当d S 、d R 同时由低电平跳为高电平时,注意观察Q 、Q _ 端的状态,重复3~5次看Q 、Q _ 端的状态是否相同,以正确理解“不定” 状态的含义。 结论: 当d S 、d R 都接低电平时,Q 和Q _ 端的状态不定。 2. 维持- 阻塞型D 触发器功能测试 双D 型正边沿维持-阻塞型触发器74LS74的逻辑符号如图4.2所示。 图中d S 、d R 端为异步置1端,置0端(或称异步置位,复位端),CP 为时钟脉冲端。试按下面步骤做实验: (1)分别在d S 、d R 端加低电平,观察并记录Q 、Q _ 端的状态。 (2)令d S 、d R 端为高电平,D 端分别接高,低电平,用点动脉 冲作为CP ,观察并记录当CP 为0、 、1、 时Q 端状态的变化。 图4.1 基本RS 触发器电 图4.2D 逻辑符号

SqlServer触发器的原理及案例

SqlServer触发器的原理及案例合理的选用触发器会让你的系统更高效 2010 Ssc

目录 第1章何为触发器 (3) 1.1 触发器的'本质' (3) 1.2 这样做带来的'功能': (3) 1.3 触发器的作用 (3) 1.4 说明: (3) 第2章对触发器3种操作的分析 (4) 2.1 创建触发器 (4) 2.2 学习案例 (5) 2.2.1 建立表 (5) 2.2.2 触发器练习1 (5) 2.2.3 触发器练习2: (6) 第3章图形化操作触发器 (7) 3.1 查看触发器情况 (7) 第4章触发器中的变量操作 (11) 第5章SQL触发器语法参考 (11)

第1章何为触发器 1.1触发器的'本质' 触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录、更改记录或者删除记录时,当事件发生时,才被自动地激活。 1.2这样做带来的'功能': 触发器可以用来对表实施复杂的完整性约束,保持数据的一致性,当触发器所保护的数据发生改变时,触发器会自动被激活,响应同时执行一定的操作(对其它相关表的操作),从而保证对数据的不完整性约束或不正确的修改。触发器可以查询其它表,同时也可以执行复杂的T-SQL语句。触发器和引发触发器执行的命令被当作一次事务处理,因此就具备了事务的所有特征。 注意:'事务具备什么特征?在触发器中的作用?' 如果发现引起触发器执行的T-SQL语句执行了一个非法操作,比如关于其它表的相关性操作,发现数据丢失或需调用的数据不存在,那么就回滚到该事件执行前的SQL SERVER数据库状态。 1.3触发器的作用 触发器可以对数据库进行级联修改,这一点刚才已经说过了。需要说明的是:'触发器和约束的关系和区别' (1)一般来说,使用约束比使用触发器效率更高。 (2)同时,触发器可以完成比CHECK约束更复杂的限制。 1.4说明: 1.与CHECK约束不同,在触发器中可以引用其它的表。 2.触发器可以发现改变前后表中数据的不一致,并根据这些不同来进行相应的操作。

mysql 触发器使用实例

mysql 触发器使用实例(修改一个表内容的同时另一个表内容自动变化) [分享]触发器小例子 触发器能进行一些约束. 这是个小例子,当Student表的StudentID列被发生更改时,BorrowStudent表的StudentID列也跟着更改.如果Student表删除某记录,BorrowStudent也删除对应StudentID的记录. /*先删除将要创建而存在的表*/ drop table if exists Student; drop table if exists BorrowStudent; /*创建表*/ create table Student( StudentID int not null primary key, StudentName varchar(30) not null, StudentSex enum('m','f') default 'm' )engine=myisam; create table BorrowStudent( BorrowRecord int not null auto_increment primary key, StudentID int not null, BorrorDate date, ReturnDate date, foreign key(StudentID) references Student(StudentID) )engine=myisam; /*插入记录*/ insert into Student values(1235412,'java','m'); insert into Student values(3214562,'jiajia','m'); insert into Student values(5441253,'purana','f'); insert into BorrowStudent(StudentID,BorrorDate,ReturnDate) values(1235412,'2007-01-01','2007-01-07'); insert into BorrowStudent(StudentID,BorrorDate,ReturnDate)

触发器的使用实验报告

实验II、触发器及其应用 一、实验目的 1、掌握基本RS、JK、D和T触发器的逻辑功能 2、掌握集成触发器的逻辑功能及使用方法 3、熟悉触发器之间相互转换的方法 二、实验原理 触发器具有两个稳定状态,用以表示逻辑状态“1”和“0”,在一定的外界信号作用下,可以从一个稳定状态翻转到另一个稳定状态,它是一个具有记忆功能的二进制信息存储器件,是构成各种时序电路的最基本逻辑单元。 1、基本RS触发器 如图1为两个与非门交叉耦合构成的基本RS触发器,它是无时钟控制低电平直接触发的触发器。基本RS触发器具有置“0”、置“1”和“保持”三种功能。通常称为置“1” 段,因为=0(=1)时触发器被置为“1”;为置“0”端,因为=0(=1)时触发器被置“0”,当==1时状态保持;==0时,触发器状态不定,应避免此种情况发生,表1为基本RS 触发器的状态表。 图1、基本RS触发器 表1、基本RS触发器功能表 输入输出 0 1 1 0 1 0 0 1 1 1 0 0 不定不定 基本RS 2、JK触发器

在输入信号为双端的情况下,JK触发器的功能完善、使用灵活和通用性较强的一种触发器。本实验采用74LS112双JK触发器,是下降沿出发的边沿触发器。引脚功能及逻辑符号如图2所示。 图2、74LS112双JK触发器引脚排列及逻辑符号 JK触发器的状态方程为:=J+ J和K是数据输入端,是触发器状态更新的依据,若J、K有两个或者两个以上输入端时,组成“与”的关系。和为两个互补输出端。通常把=0,=1的状态定为触发器“0” 状态;而把=1,=0定为“1”状态。下降沿触发JK触发器功能表如表2所示。 表2、JK触发器功能表 JK触发器常被用作缓冲存储器,移位寄存器和计数器。 3、D触发器 在输入信号为单端的情况下,D触发器用起来最为方便,其状态方程为=D,其输出状态的更新发生在CP脉冲的上升沿,故又称为上升沿触发的边沿触发器,触发器的状态只取决于时钟到来前D端的状态,D触发器的应用很广,可用作数字信号的寄存,移位寄存,分频和波形发生等。有很多种型号可供各种用途的需要而选用。如双D 74LS74、四D 74LS175、六D 74LS174等。 下图为双D774LS74的引脚排列及逻辑符号。功能表如表3.

sqlserver 触发器

SQL Server 触发器创建、删除、修改 推荐揪错烈火学院> 网络编程> SQL SERVER > 阅读文章正文 一﹕触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二﹕SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表。 一﹕触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二﹕SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后﹐与该触发器相关的这两个表也被删除。Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。 Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。 三﹕Instead of 和After触发器 SQL Server2000提供了两种触发器﹕Instead of 和After 触发器。这两种触发器的差别在于他们被激活的同﹕ Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在

数据库存储器与触发器实验报告(互联网+)

南昌航空大学实验报告 二0一七年 5 月 3 日 课程名称:数据库概论实验名称:存储器与触发器 班级:xxx 姓名:xxx 同组人: 指导教师评定:签名: 一、实验环境 1.Windows2000或以上版本; 2.SQLServer2000或2005。 二、实验目的 1.掌握存储过程的创建,修改,使用,删除; 2.掌握触发器的创建,修改,使用,删除。 三、实验步骤及参考源代码 1.创建过程代码: CREATE PROCEDURE C_P_Proc(@ccna varchar(10),@cno char(4)OUTPUT,@cna varchar(10)OUTPUT,@pna varchar(20)OUTPUT,@num int OUTPUT) AS SELECT @cna=cna,@cno=https://www.wendangku.net/doc/8a16506768.html,o,@pna=pna,@num=num FROM cp,customer,paper WHERE https://www.wendangku.net/doc/8a16506768.html,o=https://www.wendangku.net/doc/8a16506768.html,o AND paper.pno=cp.pno AND cna=@ccna;

6.执行存储过程C_P_Pro,实现对李涛,钱金浩等不同顾客的订阅信息查询execute C_P_Proc@name='李涛' execute C_P_Proc@name='钱金浩' 7,删除存储过程C_P_Prcc DROP PROCEDURE C_P_PROC (4)在DingBao数据库中针对PAPER创建插入触发器TR_PA PER_I、删除触发器TR_PAPER_D、修改触发器TR_PAPER_U。具体要求如下。

<1>对PAPER的插入触发器:插入报纸记录,单价为负值或为空时,设定为10元。 CREATE TRIGGER TR_PAPER_I ON paper FOR INSERT AS DECLARE @ippr FLOAT; declare @ipno int; SELECT @ippr=ppr,@ipno=pno from inserted begin if @ippr<0 or @ippr is NULL begin raiserror('报纸的单价为空或小于零!',16,1) update paper set ppr=10 where paper.pno=@ipno end

SqlServer触发器的原理及案例

触发器 ?触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化(INSERT、 UPDATE 或DELETE)时自动执行 ?触发器可以查询其它表,并可以包含复杂的Transact-SQL 语句 ?主要用于强制复杂的业务规则或要求 优点 ?自动执行 ?实现相关表层叠修改,实现多个表之间数据的一致性和完整性 ?实现比check约束更复杂的限制,可以引用其他表中的列 触发器的类型 ?AFTER触发器:在数据变动(INSERT、UPDATE、DELETE操作)完成后激发,只能在表 上定义,同一个表中可以有多个AFTER触发器 ?INSTEAD OF触发器:在数据变动以前被激发,并取代变动数据(INSERT、UPDATE、 DELETE操作),转而去执行触发器定义的操作,可以定义在表或视图上,每个update、insert和delete语句最多可以定义一个INSTEAD OF触发器。 创建触发器 ?CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [, ][DELETE]} AS sql_statement [...n ] } 触发器示例: ?CREATE TRIGGER reminder ON titles FOR INSERT, UPDATE AS RAISERROR (50009, 16, 10) 指定触发器何时激发 ?AFTER 触发器在触发操作(INSERT、UPDATE 或DELETE)后和处理完任何约束后激 发。可通过指定AFTER 或FOR 关键字来请求AFTER 触发器。 ?INSTEAD OF 触发器代替触发动作进行激发,并在处理约束之前激发。 ?对于每个触发操作(UPDATE、DELETE 和INSERT),每个表或视图只能有一个 INSTEAD OF 触发器。而一个表对于每个触发操作可以有多个AFTER 触发器。 触发器示例: create TRIGGER reminder ON titles FOR INSERT, delete,update AS --修改操作 if (select count(*) from inserted) > 0 and (select count(*) from deleted) >0 begin RAISERROR ('修改成功', 16, 10) end

触发器及其应用实验报告 - 图文-

实验报告 一、实验目的和任务 1. 掌握基本RS、JK、T和D触发器的逻辑功能。 2. 掌握集成触发器的功能和使用方法。 3. 熟悉触发器之间相互转换的方法。 二、实验原理介绍 触发器是能够存储1位二进制码的逻辑电路,它有两个互补输出端,其输出状态不仅与输入有关,而且还与原先的输出状态有关。触发器有两个稳定状态,用以表示逻辑状态"1"和"0飞在二定的外界信号作用下,可以从一个稳定状态翻转到另一个稳定状态,它是一个具有记忆功能的二进制信息存储器件,是构成各种时序电路的最基本逻辑单元。 1、基本RS触发器 图14-1为由两个与非门交叉祸合构成的基本RS触发器,它是无时钟控制低电平直接触发的触发器。 基本RS触发器具有置"0"、置"1"和保持三种功能。通常称s为置"1"端,因为 s=0时触发器被置"1"; R为置"0"端,因为R=0时触发器被置"0"。当S=R=1时状态保持,当S=R=0时为不定状态,应当避免这种状态。

基本RS触发器也可以用两个"或非门"组成,此时为高电平有效。 S Q S Q Q 卫R Q (a(b 图14-1 二与非门组成的基本RS触发器 (a逻辑图(b逻辑符号 基本RS触发器的逻辑符号见图14-1(b,二输入端的边框外侧都画有小圆圈,这是因为置1与置。都是低电平有效。 2、JK触发器 在输入信号为双端的情况下,JK触发器是功能完善、使用灵活和通用性较强的一种触发器。本实验采用74LS112双JK触发器,是下降边沿触发的边沿触发器。引脚逻辑图如图14-2所示;JK触发器的状态方程为: Q,,+1=J Q"+K Q 3 5

J Q CLK K B Q 图14-2JK触发器的引脚逻辑图 其中,J和IK是数据输入端,是触发器状态更新的依据,若J、K有两个或两个以上输入端时,组成"与"的关系。Q和Q为两个互补输入端。通常把Q=O、Q=1的状态定为触发器"0"状态;而把Q=l,Q=0 定为"}"状态。 JK触发器常被用作缓冲存储器,移位寄存器和计数器。 CC4027是CMOS双JK触发器,其功能与74LS112相同,但采用上升沿触发,R、S端为高电平

sqlserver 建立学生表上触发器代码

--⒁在学生成绩表中,显示存在有 85 分以上成绩的课程号,并统计各门课程不及格人数在 10 人以上的课程数量。 SELECT course_id FROM stud_grade WHERE grade>85 GO select count(*) from ( SELECT course_id 课程号,count(course_id) 人数 FROM stud_grade WHERE grade<60 GROUP BY course_id HAVING count(course_id) >=10 ) -(7) 首先显示“计算机工程系”、“计算机网络技术专业”、班全体学生的基本信息,然后再统计“计算机工程系”、“计算机网络技术专业”、班的学生人数。 SELECT substring(stud_id,3,6)专业编号,count(*)人数 FROM stud_info WHERE substring(stud_id,3,6)=( select substring(speccode,3,6)+'02' from dbo.specialty_code where specname='计算机应用技术') --(9)在学生成绩表中,显示最低分大于60,最高分小于80 的stud_id 列。 select stud_id from dbo.stud_grade group by stud_id having max(grade)<80 and min(grade)>60 --(17)显示课程号为“”、课程成绩高于“”课程的学生的课程名、学号和姓名,并按成绩从高到低次序排列。 select course_name,g1.stud_id,g1.[name] from dbo.lesson_info,dbo.stud_grade as g1,dbo.stud_grade as g2 where dbo.lesson_info.course_id=g1.course_id and g1.stud_id=g2.stud_id and g1.course_id='0401010103' and g2.course_id='0401010104'and g1.grade>g2.grade order by g1.grade

触发器实验报告

触发器实验报告 集团标准化工作小组 #Q8QGGQT-GX8G08Q8-GNQGJ8-MHHGN#

实验报告 课程名称:数字电子技术基础实验 指导老师: 周箭 成绩:__________________ 实验名称:集成触发器应用 实验类型: 同组学生姓名:__邓江毅_____ 一、实验目的和要求(必填) 二、实验内容和原 理(必填) 三、主要仪器设备(必填) 四、操作方法和实 验步骤 五、实验数据记录和处理 六、实验结果与分 析(必填) 七、讨论、心得 实验内容和原理 1、D →J-K 的转换实验 设计过程:J-K 触发器和D 触发器的次态方程如下: J-K 触发器:n n 1+n Q Q J =Q K +, D 触发器:Qn+1=D 若将D 触发器转换为J-K 触发器,则有:n n Q Q J =D K +。 实验结果: J K Qn-1 Qn 功能 0 0 0 0 保持 1 1 0 1 0 0 置0 1 0 1 1 0 1 翻转 1 0 1 0 1 置1 1 1 实验截图: 专业:电卓1501 姓名:卢倚平 学号: 日期:地点:东三404

(上:Qn ,下:CP ,J 为高电平时) 2、D 触发器转换为T ’触发器实验 设计过程:D 触发器和T ’触发器的次态方程如下: D 触发器:Q n+1= D , T ’触发器:Q n+1=!Q n 若将D 触发器转换为T ’触发器,则二者的次态方程须相等,因此有:D=!Qn 。 实验截图: (上:Qn ,下:!Qn )CP 为1024Hz 的脉冲。 3、J-K →D 的转换实验。 ①设计过程: J-K 触发器:n n 1+n Q Q J =Q K , D 触发器:Qn+1=D 若将J-K 触发器转换为D 触发器,则二者的次态方程须相等,因此有:J=D ,K=!D 。 实验截图:

相关文档
相关文档 最新文档