sql sqlserver触发器语法没作用怎么办

> 问题详情
SQL Server存储过程,与触发器的作用,与优缺点
悬赏:0&答案豆
发布时间:
SQL Server存储过程,与触发器的作用,与优缺点请帮忙给出正确答案和分析,谢谢!
为您推荐的考试题库
您可能感兴趣的试题
12.SQL语句23.标准的SQL与T-SQL的区别?写出4个SQL命令和 3个T-SQL命令。34.在实践中,对象设计常常来自数据。下表是一个软件顾问公司的数据,它列出顾问师的现行工作分配。很明显,这个表违反了&第三范式。审查表中的数据,然后进行面向对象的设图表达出表中隐含对象之间的静态关系。再用“一类——表格”标准法则,&把对象映射为规范化的关系结构。名字&&&&&&&&&&身份证号&工作分配&百分比&价格&公司&地址John Smith&123-45-6789&数据库设计&60% 55&ABCD&888aveTom Chan&582-54-5528&网络安装&40% 70&ABCD&888aveMike Brown&473-55-8721&软件编码&100%&80&IT。com 1 main stJohn Smith&123-45-6789&数据库设计&40% 60&IT。com 1 main stSue Li 743-31-3782&客户培训&100%&65&IT。com 1 main stTom chan&&&582-54-5528&网络安装&60% 75&HiTech&7 state Rd45.数据库表user pk ID int Name (char) Age(int) Sex(bit)&(1)&sex=0,age=20的name降序&(2)&当sex=1 时,age+1&(3)&删除所有奇数据&(4)&统计age&20的个数&(5)&年龄最大的人的名字
我有更好的答案
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
每天只需0.4元
选择支付方式
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
恭喜你被选中为
扫一扫-免费查看答案!
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
提示:请截图保存您的账号信息,以方便日后登录使用。
常用邮箱:
用于找回密码
确认密码:sqlserver触发器为什么不生效_百度知道
sqlserver触发器为什么不生效
现有数据库文件,还原之后在一张表里看到了触发器,但不生效。然后我删了这个触发器,用数据库管理工具生成的create语句重新创建这个触发器,居然又有用了。请问触发器是不是在还原数...
现有数据库文件,还原之后在一张表里看到了触发器,但不生效。然后我删了这个触发器,用数据库管理工具生成的create语句重新创建这个触发器,居然又有用了。请问触发器是不是在还原数据库后默认不会生效?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
草原上之狼
来自电脑网络类芝麻团
草原上之狼
采纳数:18598
获赞数:30201
参与团队:
看上去没有明显错误,你试一下把这个地方重新赋值round(((s.skje*s.ll)/3600)*datediff(day,s.skrq,s.dqhkr),2)
把这里先写成99.999 ,看看是否有效果;另外检查你这个赋值表达式是否有错误,可能结果过大或者过小检查你这个字段是否有约束等条件限制;检查是否存在其他名称的触发器,导致相互作用
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。SQL SERVER使用嵌套触发器
作者:用户
本文讲的是SQL SERVER使用嵌套触发器,
server|触发器
如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器……这些触发器就是嵌套触发器。触发器可嵌套至 32 层
server|触发器
如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器……这些触发器就是嵌套触发器。触发器可嵌套至 32 层,并且可以控制是否可以通过"嵌套触发器"服务器配置选项进行触发器嵌套。如果允许使用嵌套触发器,且链中的一个触发器开始一个无限循环,则超出嵌套级,而且触发器将终止。可使用嵌套触发器执行一些有用的日常工作,如保存前一触发器所影响行的一个备份。例如,可以在 titleauthor 上创建一个触发器,以保存由 delcascadetrig 触发器所删除的 titleauthor 行的备份。在使用 delcascadetrig 时,从 titles 中删除title_id PS2091 将删除 titleauthor 中相应的一行或多行。要保存数据,可在 titleauthor 上创建 DELETE 触发器,该触发器的作用是将被删除的数据保存到另一个单独创建的名为 del_save 表中。例如:CREATE TRIGGER savedel
ON titleauthorFOR DELETEAS
INSERT del_save
SELECT * FROM deleted不推荐按依赖于顺序的序列使用嵌套触发器。应使用单独的触发器层叠数据修改。说明
由于触发器在事务中执行,如果在一系列嵌套触发器的任意层中发生错误,则整个事务都将取消,且所有的数据修改都将回滚。在触发器中包含 PRINT 语句,用以确定错误发生的位置。递归触发器触发器不会以递归方式自行调用,除非设置了 RECURSIVE_TRIGGERS 数据库选项。有两种不同的递归方式: 直接递归 即触发器激发并执行一个操作,而该操作又使同一个触发器再次激发。例如,一应用程序更新了表 T3,从而引发触发器 Trig3。Trig3 再次更新表 T3,使触发器 Trig3 再次被引发。间接递归 即触发器激发并执行一个操作,而该操作又使另一个表中的某个触发器激发。第二个触发器使原始表得到更新,从而再次引发第一个触发器。例如,一应用程序更新了表 T1,并引发触发器 Trig1。Trig1 更新表 T2,从而使触发器 Trig2 被引发。Trig2 转而更新表 T1,从而使 Trig1 再次被引发。当将 RECURSIVE_TRIGGERS 数据库选项设置为 OFF 时,仅防止直接递归。若要也禁用间接递归,请将 nested triggers 服务器选项设置为 0。示例A. 使用递归触发器解决自引用关系递归触发器的一种用法是用于带有自引用关系的表(亦称为传递闭包)。例如,表 emp_mgr 定义了: 一个公司的雇员 (emp)。每个雇员的经理 (mgr)。组织树中向每个经理汇报的雇员总数 (NoOfReports)。 递归 UPDATE 触发器在插入新雇员记录的情况下可以使 NoOfReports 列保持最新。INSERT 触发器更新经理记录的 NoOfReports 列,而该操作递归更新管理层向上其它记录的 NoOfReports 列。USE pubsGO-- Turn recursive triggers ON in the database.ALTER DATABASE pubs
SET RECURSIVE_TRIGGERS ONGOCREATE TABLE emp_mgr (
emp char(30) PRIMARY KEY,
mgr char(30) NULL FOREIGN KEY REFERENCES emp_mgr(emp),
NoOfReports int DEFAULT 0)GOCREATE TRIGGER emp_mgrins ON emp_mgrFOR INSERTASDECLARE @e char(30), @m char(30)DECLARE c1 CURSOR FOR
SELECT emp_mgr.emp
emp_mgr, inserted
WHERE emp_mgr.emp = inserted.mgrOPEN c1FETCH NEXT FROM c1 INTO @eWHILE @@fetch_status = 0BEGIN
UPDATE emp_mgr
SET emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1 -- Add 1 for newly
WHERE emp_mgr.emp = @e
-- added employee.
FETCH NEXT FROM c1 INTO @eENDCLOSE c1DEALLOCATE c1GO-- This recursive UPDATE trigger works assuming:--
1. Only singleton updates on emp_mgr.--
2. No inserts in the middle of the org tree.CREATE TRIGGER emp_mgrupd ON emp_mgr FOR UPDATEASIF UPDATE (mgr)BEGIN
UPDATE emp_mgr
SET emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1 -- Increment mgr's
FROM inserted
-- (no. of reports) by
WHERE emp_mgr.emp = inserted.mgr
-- 1 for the new report.
UPDATE emp_mgr
SET emp_mgr.NoOfReports = emp_mgr.NoOfReports - 1 -- Decrement mgr's
FROM deleted
-- (no. of reports) by 1
WHERE emp_mgr.emp = deleted.mgr
-- for the new report.ENDGO-- Insert some test data rows.INSERT emp_mgr(emp, mgr) VALUES ('Harry', NULL)INSERT emp_mgr(emp, mgr) VALUES ('Alice', 'Harry')INSERT emp_mgr(emp, mgr) VALUES ('Paul', 'Alice')INSERT emp_mgr(emp, mgr) VALUES ('Joe', 'Alice')INSERT emp_mgr(emp, mgr) VALUES ('Dave', 'Joe')GOSELECT * FROM emp_mgrGO-- Change Dave's manager from Joe to HarryUPDATE emp_mgr SET mgr = 'Harry'WHERE emp = 'Dave'GOSELECT * FROM emp_mgrGO以下是更新前的结果:emp
NoOfReports------------------------------ ----------------------------- -----------Alice
0以下为更新后的结果:emp
NoOfReports------------------------------ ----------------------------- -----------Alice
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有
的相关内容,欢迎继续使用右上角搜索按钮进行搜索递归
sql 触发器嵌套、sql server 触发器、sqlserver 触发器、sqlserver触发器实例、sqlserver2008触发器,以便于您获取更多的相关知识。
... 我使用透明网关把oracle连接sql server2000,在oracle上做了个触发器绑定到一张表A,表A如果insert或者update将数据同步到sql server2000上,结果insert成功了,update部分语句一直编译不通过,语法有问题!下面图中update中的code与status一直...
sql触发器的用法 触发器:是一种特殊类型的存储过程,不由用户直接调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(Insert,Delete,Update)。创建触发器时会对其进行定义,以便在对特定表或列做特定类...
  触发器是类似于存储程序的数据库对象,它响应数据库环境下的某个请求。SQL Sever 2005包含3个触发器对象:AFTER,数据定义语言 (DDL)和INSTEAD-OF。   AFTER触发器是存储程序,它发生于数据操作语句作用之后,例如删除语句等...
...免数据类型匹配错误。在每个SQL语句之后要检查@@error。4触发器编码规范4.1命名规范触发器名为相应的表名加上后缀Insert触发器加'_i',Delete触发器加'_d',Update触发器加'_u',如:r_bch_i,r_bch_d,r_bch_u。4.2 设计规范在触发器中必须...
... one cannot be reused. connection.connect(function(err) { // The server is either down if(err) { // or restarting (takes a while sometimes). console.log('error when connecting to db:', err); setTimeout(handleDisconnect, 2000); // We introduce a delay before ...
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
40+云计算产品,6个月免费体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
云服务器9.9元/月,大学必备
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!论文发表、论文指导
周一至周五
9:00&22:00
浅谈SQL Server触发器之使用
  摘要:在SQL Server数据库中为了对数据库表实施复杂的完整性约束,触发器是比较理想的选择工具。它可以对数据库表进行级联修改,保持数据的一致性。它的执行是由事件来触发,当对一个表进行插入、更新、删除操作时就会激活它执行,从而通过触发器的执行更好地实现数据的完整性约束和业务规则等。 中国论文网 /8/view-6384534.htm  关键词:SQL Serve;数据库;触发器;工作过程;维护   中图分类号:TP313 文献标识码:A 文章编号:(2-03   Abstract: In the SQL Server database to form the integrity constraints on the database to implement complex, the trigger is ideal selection tool. It can be cascaded to modify the database table, the maintenance of data consistency. It is implemented by the event to trigger, when on a table to insert, update, delete operations will activate it execution, thus through the execution of triggers to better achieve the integrity constraints andbusiness rules, data etc..   Key words: SQL Serve; database; triggers; work process; maintain   在数据库管理系统中,常常会进行数据的插入、更新、删除等操作,在此操作过程中保持数据的完整性是非常重要的一项工作。当一些普通的维护方法不能满足要求时我们就要考虑用到触发器了。   1 触发器的特点   触发器是一种特殊的存储过程,其特殊性在于它并不需要由用户来直接调用,而是在对表或视图进行插入记录、更改记录或者删除记录时自动执行的。   2 触发器的使用场合   实现对相关表的级联修改;拒绝或回滚违反引用完整性的操作;完成比CHECK约束更复杂的限制;检查修改前后表中数据的不同并执行相应的操作。   3 触发器3种操作的实现过程   DML触发器在执行过程中可以使用两个特殊的临时表―deleted表和inserted表。这两个表存储于内存中,它们在结构上与触发器所在的表的结构相同。   deleted表用于存储delete、update语句所影响的行的副本。在执行delete或update语句时,数据行从触发器表中删除,并传输到deleted表中。   inserted表用于存储insert、update语句所影响的行的副本,在一个插入或更新事务处理中,新建行被同时添加到更新操作的表和insered表中。insered表中的行是触发器表中新行的副本。   两个表由系统管理,不允许用户直接对其进行修改,但可以访问。触发器工作完成后,与该触发器相关的这两个表也将被删除。   现通过实例说明触发器的妙用之处:studentinfo数据库包括学生表student(学号SNO,姓名SNAME,系名DEPART,性别SEX,出生日期DDATE)、课程表Course(课程编号CNO,课程名称CNAME)和成绩表score(学号SNO,课程编号CNO,成绩GRADE)   3.1 Insert触发器的工作过程   Insert触发器是当用INSERT语句向表中插入数据时都会执行的触发器。   当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。inserted表包含了INSERT语句中已记录的插入动作。inserted表还允许引用由初始化INSERT语句而产生的日志数据。   例如:创建一个触发器。当向student表中插入一条学生记录时引发该触发器,向scores表中插入两行数据。   Use studentinfo   Go   Create trigger insert_score_trigger   On student   For insert as   Set nocount off   Declare @st_no int   Select @stno=学号 from inserted   Insert into score(sno,cno) Values (@st_no,1)   Insert into score(sno,cno) Values (@st_no,2)   Go   Insert into student(sno,sname,depart,sex,ddate)   Values(‘2012001’,’王平’,’计算机科学技术’,’男’,’’)   Select score.sno as 学号,sname as 姓名,course as 课程,score as 成绩   From score as sc inner join student as s on s.sno=sc.sno   Inner join course as c on sc.cno=c.cno
  Where sname=’王平’   go   3.2 DELETE触发器的工作过程   deleted表是一个逻辑表,它存放已被删除数据行的一个副本。当触发delete触发器后,从受影响的表中删除的行将被放置到该特殊的表中。   例如:在student表上创建一个触发器trigger_delete,当删除student表中某个同学的记录信息时,score表中与该同学相关的成绩信息也自动被删除。   Use Studentinfo   Go   if exists (select name from sysobjects   where name=' trigger_delete' and type='tr')   drop trigger trigger_delete   go   create trigger trigger_delete   on student   for delete   as   delete score   where sno=(select sno from deleted)   go   3.3 UPDATE触发器的工作过程   可将UPDATE语句看成两步操作:即捕获数据前像的DELETE语句,和捕获数据后像的INSERT语句。当在定义有触发器的表上执行UPDATE语句时,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。   例如:在course表上创建一个触发器trigger_update,当更新course表中某门课程的记录信息时,score表中与该课程相关的信息也自动被更新。   Use Studentinfo   go   if exists (select name from sysobjects   where name='trigger_update' and type='tr')   drop trigger trigger_update   go   create trigger trigger_update   on course   for update   as   update score   set cno=   (select cno from inserted)   where cno=(select cno from deleted)   go   4 过多的使用触发器会给数据库及应用程序的维护带来困难   SQL server触发器虽然可以用来保障数据的完整性,但我们要有选择的使用才行,一般情况下,较为简单的完整性要求,我们通过规则、约束、默认值就可以解决了,就没有必要使用触发器了。而且两者在运行机制上也是有区别的,规则、约束、默认值这些是在数据更改之前进行数据验证,而触发器是在数据更改之后才进行验证的。   如果我们对触发器过分的依赖,就会造成遍地是程序的情况,因为触发器本身就需要别的程序给它一个触发条件,也就是说至少在两个地方存在着程序,必然影响数据库的结构。   5 结束语   总之,触发器的使用很方便,在保持数据的完整性操作方面比约束、规则等具有更加高效的功能,而且也比较简单。重要的是理解insert、delete、update实现原理及工作过程。虽然触发器功能强大,能够轻松可靠地实现许多复杂的功能,但要慎用。只有合理的使用触发器才会给我们的数据库操作工作带来很大的便利。   参考文献:   [1] 杨得鑫.SQL server 2005开发与应用[M].北京:机械工业出版社.2008.   [2] 李红.数据库原理与应用[M].北京:高等教育出版社.2011.   [3] 李昆.SQL SERVER2005课程设计案例精编[M].北京:中国水利水电出版社,2010.   [4] 何文华.SQL Server 2005应用开发教程[M].北京:电子工业出版社,2010.
转载请注明来源。原文地址:
【xzbu】郑重声明:本网站资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有,如有不愿意被转载的情况,请通知我们删除已转载的信息。
xzbu发布此信息目的在于传播更多信息,与本网站立场无关。xzbu不保证该信息(包括但不限于文字、数据及图表)准确性、真实性、完整性等。如何制定自己的SQL Server 2000触发器
稿源:赛迪网
本文从定义入手仔仔细细的来讲解如何制定自己的触发器。
创建一个简单的触发器
触发器是一种特殊的存储过程,类似于事件函数,SQL Server? 允许为 INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列 T-SQL语句。
触发器可以在查询分析器里创建,也可以在表名上点右键-&&所有任务&-&&管理触发器&来创建,不过都是要写 T-SQL 语句的,只是在查询分析器里要先确定当前操作的数据库。
创建触发器用 CREATE TRIGGER
CREATE TRIGGER 触发器名称
FOR INSERT、UPDATE 或 DELETE
T-SQL 语句
注意:触发器名称是不加引号的。
如下是联机丛书上的一个示例,当在 titles 表上更改记录时,发送邮件通知 MaryM。
CREATE TRIGGER reminder
FOR INSERT, UPDATE, DELETE
EXEC master..xp_sendmail 'MaryM',
'Don''t forget to print a report for the distributors.'
重命名触发器
用查询分析器重命名:
exec sp_rename 原名称, 新名称
sp_rename 是 SQL Server? 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。
用企业管理器重命名:
在表上点右键-&&所有任务&-&&管理触发器&,选中所要重命名的触发器,修改触发器语句中的触发器名称,点击&确定&。
删除触发器
用查询分析器删除:
在查询分析器中使用 drop trigger 触发器名称 来删除触发器。
也可以同时删除多个触发器:drop trigger 触发器名称,触发器名称...
注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在:
if Exists(select name from sysobjects where name=触发器名称 and xtype='TR')
用企业管理器删除:
在企业管理器中,在表上点右键-&&所有任务&-&&管理触发器&,选中所要删除的触发器,然后点击&删除&。
如何查看某个触发器的内容
用查询分析器查看:
use 数据库名
exec sp_helptext '触发器名称'
将会以表的样式显示触发器内容。
除了触发器外,sp_helptext 还可以显示 规则、默认值、未加密的存储过程、用户定义函数、视图的文本。
用企业管理器查看:
在表上点右键-&&所有任务&-&&管理触发器&,选择所要查看的触发器。
如何查看当前数据库中有哪些触发器
在查询分析器中运行:
use 数据库名
select * from sysobjects where xtype='TR'
sysobjects
保存着数据库的对象,其中 xtype 为 TR 的记录即为触发器对象。
在 name 一列,我们可以看到触发器名称。
sp_helptrigger
存储过程 sp_helptrigger 用于查看触发器的属性。
sp_helptrigger 有两个参数:第一个参数为表名;第二个为触发器类型,为 char(6) 类型,可以是 INSERT、UPDATE、DELETE,如果省略则显示指定表中所有类型触发器的属性。
use 数据库名
exec sp_helptrigger tbl
触发器更多语法
INSTEAD OF:
执行触发器语句,但不执行触发触发器的 SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。例:
create trigger f
instead of delete
insert into Logs...
IF UPDATE(列名):
检查是否更新了某一列,用于 insert 或 update,不能用于 delete。例:
create trigger f
for update
if update(status) or update(title)
sql_statement --更新了 status 或 title 列
inserted、deleted:
这是两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录形成的表,deleted 保存的是 delete 或 update 之前所影响的记录形成的表。例:
create trigger tbl_delete
for delete
declare @title varchar(200)
select @title=title from deleted
insert into Logs(logContent)
values('删除了 title 为:' + title + '的记录')
说明:如果向 inserted 或 deleted 虚拟表中取字段类型为 text、image 的字段值时,所取得的值将会是 null。
触发器回滚
我们看到许多注册系统在注册后都不能更改用户名,但这多半是由应用程序决定的, 如果直接打开数据库表进行更改,同样可以更改其用户名,在触发器中利用回滚就可以巧妙地实现无法更改用户名。
use 数据库名
create trigger tr
for update
if update(userName)
rollback tran
关键在最后两句,其解释为:如果更新了 userName 列,就回滚事务。
递归、嵌套触发器
递归触发器:
递归分两种,间接递归和直接递归。我们举例解释如下,假如有表1、表2名称分别为 T1、T2,在 T1、T2 上分别有触发器 G1、G2。
间接递归:对 T1 操作从而触发 G1,G1 对 T2 操作从而触发 G2,G2 对 T1 操作从而再次触发 G1...
直接递归:对 T1 操作从而触发 G1,G1 对 T1 操作从而再次触发 G1...
嵌套触发器:
类似于间接递归,间接递归必然要形成一个环,而嵌套触发器不一定要形成一个环,它可以 T1-&T2-&T3...这样一直触发下去,最多允许嵌套 32 层。
设置直接递归:
默认情况下是禁止直接递归的,要设置为允许有两种方法:
T-SQL:exec sp_dboption 'dbName', 'recursive triggers', true EM:数据库上点右键-&属性-&选项。 设置间接递归、嵌套
默认情况下是允许间接递归、嵌套的,要设置为禁止有两种方法:
T-SQL:exec sp_configure 'nested triggers', 0 --第二个参数为 1 则为允许 EM:注册上点右键-&属性-&服务器设置。 (责任编辑:王瑞)
相关文章:
如何在多维数据集中设置访问权限
深入了解SQLServer系统数据库工作原理
有好的文章希望站长之家帮助分享推广,猛戳这里
本网页浏览已超过3分钟,点击关闭或灰色背景,即可回到网页

我要回帖

更多关于 sqlserver正版价格 的文章

 

随机推荐