当前位置:首页 » 编程语言 » sql如何调试触发器
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql如何调试触发器

发布时间: 2022-07-06 14:06:35

⑴ 如何调试触发器-数据库专栏,sql Server

//-------------------------------------调试触发器//------------------------------------- 作者:四海为圈(原创) //------------------------------------- 1、创建存储过程以便触发触发器 3、选择单步运行存储过程 2、在触发事件的语句如:insert 、update 、delete语句时按f11 //------------------------------------- 本方法在sql server 2000+win2000 server 通过测试 本方法在vs.net 2003 + sql server 2000+win2000 server 通过测试 //-------------------------------------good转贴请注明来源 维护网络道德是每个网民的义务 //-------------------------------------实例教学:一、打开sql查询分析器 二、将以下sql语句复制到查询窗口并运行use pubscreate trigger trigger_update on authorsfor updateasbeginprint(update lastname=hoho)endcreate proc authors_procinsertasbeginupdate authors set au_lname=hoho where au_id=172-32-1176end三、在左边的对象浏览器中选择pubs->存储过程在authors_procinsert(如未出现请刷新pubs数据库)上右击弹出菜单选择“调试...”

⑵ sql2008 怎么调试触发器

在项目中,单击右键选择"添加"->"触发器",代码如下(validateyear.cs):
using
system;
using
system.data;
using
system.data.sqlclient;
using
microsoft.sqlserver.server;
public
partial
class
triggers
{
//
为目标输入现有表或视图并取消对特性行的注释
[microsoft.sqlserver.server.sqltrigger
(name="validateyear",
target="humanresources",
event="for
insert")]
public
static
void
validateyear()
{
//
用您的代码替换
sqlconnection
conn
=
new
sqlconnection("context
connection=true");
//定义查询
string
sql
=
"select
count(*)
"
+
"from
inserted
"
+
"where
year(modifieddate)<>2012";
sqlcommand
comm
=
new
sqlcommand(sql,
conn);
//打开连接
conn.open();
//获得行数
int
numbadrows
=
(int)comm.executescalar();
if
(numbadrows
>
0)
{
//get
the
sqlpipe
sqlpipe
pipe
=
sqlcontext.pipe;
//role
back
and
raise
an
error
comm.commandtext
=
"raiseerror('修改错误',11,1)";
//send
the
error
try
{
}
catch
{
}
system.transactions.transaction.current.rollback();
}
conn.close();
}
}
用于验证插入的数据是否合法,当插入表humanresources是,如果修改日期的年份不是2012将报错。
另外要注意的是要使用system.transactions.transaction.current.rollback(),必须添加system.transactions的引用

⑶ 关于sql触发器调试问题

在sql中,触发器是一种特殊类型的存储过程,它不同于sql的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如update、
insert、
delete
这些操作时,sql
server
就会自动执行触发器所定义的sql
语句,从而确保对数据的处理必须符合由这些sql
语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
(1)强化约束(enforce
restriction)
触发器能够实现比check
语句更为复杂的约束。
(2)跟踪变化(auditing
changes)
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
(3)级联运行(cascaded
operation)。
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
(4)存储过程的调用(stored
procere
invocation)。
为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在dbms(
数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(insert、
update、
delete)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。
触发器的种类
sql
server
2000
支持两种类型的触发器:after
触发器和instead
of
触发器。其中after
触发器即为sql
server
2000
版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(insert
update
delete)
之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于after
触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder
来完成此任务。
instead
of
触发器表示并不执行其所定义的操作(insert、
update、
delete),而仅是执行触发器本身。既可在表上定义instead
of
触发器,也可以在视图上定义instead
of
触发器,但对同一操作只能定义一个instead
of触发器。

⑷ 如何使用sql触发器

CREATE OR REPLACE TRIGGER INSERT_STU_TRIGGER
BEFORE INSERT ON STUDENT
FOR EACH ROW
DECLARE
v_alone_course number;
v_total_course number;
v_TRUEANSWER varchar2(20);
v_t1 number;
BEGIN
select j.题目编号1 into v_t1 from juanzi j where j.卷号=:new.卷号;
select t.分值,t.TRUEANSWER into v_alone_course,v_TRUEANSWER from timu t where t."题目编号"=v_t1;
if v_trueanswer = :new.答案1 then
select v_alone_course into :new.成绩 from al;
end if;
END;
这个是按照你的需求写的一个ORACLE数据库的SQL语句。
下面这个是测试添加语句:
insert into student(学号,教师工号,卷号,答案1) VALUES(123456,40564,1001,'A');

c语言怎么使用sql触发器

c语言怎么使用sql触发器:
定义: 何为触发器?在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 server触发器怎么设置

--SQL触发器语法参考
CreateTRIGGER 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 ]
}
}
是否可以解决您的问题?

⑺ SQL server 如何调试触发器!

一、打开sql查询分析器;

二、将以下sql语句复制到查询窗口并运行;

usepubs

createtriggertrigger_updateonauthors
forupdate
as
begin
print(updatelastname=hoho)
end

createprocauthors_procinsert
as
begin
updateauthorssetau_lname=hohowhereau_id=172-32-1176
end


三、在左边的对象浏览器中选择pubs->存储过程在authors_procinsert(如未出现请刷新pubs数据库)上右击弹出菜单选择“调试...”。

四、当运行到" update authors set au_lname=hoho where au_id=172-32-1176“时按“f11”即进入触发器代码。

⑻ Sql设置触发器

/*www.technical-programming.com,losauer2013
Target:MS/
description:Uponupdate,therows'-timestamp,
.
statement,thesuppliedvalueissetasis.
Thetstampfieldisdefinedas:
[__unixtimestamp]INTNULL
Theprimarykeyisdefinedas:
[ID]INTIDENTITY(1,1)NOTNULL
*/


FORUPDATEAS
IFUPDATE(__unixtimestamp)
BEGIN
SETNOCOUNTON--'affectedrows'count
UPDATEdbo.[mytable]
SETdbo.[mytable].[__unixtimestamp]=Inserted.[__unixtimestamp]/*+1*/
FROMdbo.[mytable],Inserted,Deleted
WHEREdbo.[mytable].[ID]=Inserted.[ID]
END
ELSE
BEGIN
SETNOCOUNTON--'affectedrows'count
UPDATEdbo.[mytable]
SETdbo.[mytable].[__unixtimestamp]=(CASEWHENInserted.[__unixtimestamp]>''THENDATEDIFF(s,'19700101',GetDate())
ELSEInserted.[__unixtimestamp]END)
FROMdbo.[mytable],Inserted
WHEREdbo.[mytable].[ID]=Inserted.[ID]
END

/*Shortalternative,foruseinaproctiveenvironment*/


FORUPDATEAS
IFNOTUPDATE(__unixtimestamp)
BEGIN
SETNOCOUNTON--'affectedrows'count
UPDATEdbo.[mytable]
SETdbo.[mytable].[__unixtimestamp]=(CASEWHENInserted.[__unixtimestamp]>''THENDATEDIFF(s,'19700101',GetDate())
ELSEInserted.[__unixtimestamp]END)
FROMdbo.[mytable],Inserted
WHEREdbo.[mytable].[ID]=Inserted.[ID]