建立两个单域的表格。一个表格中为姓名列表(表格名:data)。
另一个表格中是所插入字符的字符数(表格名:chars)。在data表格中定义一个触发器。
每次在其中插入一个新姓名时,chars表格中运行的总数就会根据新插入记录的字符数目进行自动更新。
(见列表A)
mysql> CREATE TABLE data (name VARCHAR(255));
Query OK, 0 rows affected (0.09 sec)
mysql> CREATE TABLE chars (count INT(10));
Query OK, 0 rows affected (0.07 sec)
mysql> INSERT INTO chars (count) VALUES (0);
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TRIGGER t1 AFTER INSERT ON
data FOR EACH ROW UPDATE chars SET count = count + CHAR_LENGTH(NEW.name);
Query OK, 0 rows affected (0.01 sec)
列表A
理解上面代码的关键在于CREATE TRIGGER命令,被用来定义一个新触发器。这个命令建立一个新触发器,假定的名称为t1,每次有一个新记录插入到data表格中时,t1就被激活。
在这个触发器中有两个重要的子句:
AFTER INSERT子句表明触发器在新记录插入data表格后激活。
UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)子句表示触发器激活后执行的SQL命令。在本例中,该命令表明用新插入的data.name域的字符数来更新 chars.count栏。这一信息可通过内置的MySQL函数CHAR_LENGTH()获得。
放在源表格域名前面的NEW关键字也值得注意。这个关键字表明触发器应考虑域的new值(也就是说,刚被插入到域中的值)。MySQL还支持相应的OLD前缀,可用它来指域以前的值。
可以通过调用SHOW TRIGGER命令来检查触发器是否被激活,如列表B所示。
❷ SQL触发器如何使用
CREATE TRIGGER
创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。Microsoft® SQL Server™ 允许为任何给定的 INSERT、UPDATE 或 DELETE 语句创建多个触发器。
语法
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 ]
}
}
参数
trigger_name
是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。
Table | view
是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。
WITH ENCRYPTION
加密 syscomments 表中包含 CREATE TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server 复制的一部分发布。
AFTER
指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。
如果仅指定 FOR 关键字,则 AFTER 是默认设置。
不能在视图上定义 AFTER 触发器。
INSTEAD OF
指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。
在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。
INSTEAD OF 触发器不能在 WITH CHECK OPTION 的可更新视图上定义。如果向指定了 WITH CHECK OPTION 选项的可更新视图添加 INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。
{ [DELETE] [,] [INSERT] [,] [UPDATE] }
是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。
对于 INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。
WITH APPEND
指定应该添加现有类型的其它触发器。只有当兼容级别是 65 或更低时,才需要使用该可选子句。如果兼容级别是 70 或更高,则不必使用 WITH APPEND 子句添加现有类型的其它触发器(这是兼容级别设置为 70 或更高的 CREATE TRIGGER 的默认行为)。有关更多信息,请参见 sp_dbcmptlevel。
WITH APPEND 不能与 INSTEAD OF 触发器一起使用,或者,如果显式声明 AFTER 触发器,也不能使用该子句。只有当出于向后兼容而指定 FOR 时(没有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以后的版本将不支持 WITH APPEND 和 FOR(将被解释为 AFTER)。
NOT FOR REPLICATION
表示当复制进程更改触发器所涉及的表时,不应执行该触发器。
AS
是触发器要执行的操作。
sql_statement
是触发器的条件和操作。触发器条件指定其它准则,以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。
当尝试 DELETE、INSERT 或 UPDATE 操作时,Transact-SQL语句中指定的触发器操作将生效。
触发器可以包含任意数量和种类的 Transact-SQL 语句。触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。触发器中的 Transact-SQL 语句常常包含控制流语言。CREATE TRIGGER 语句中使用几个特殊的表:
deleted 和 inserted 是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索 deleted 表中的所有值,请使用:
SELECT *
FROM deleted
如果兼容级别等于 70,那么在 DELETE、INSERT 或 UPDATE 触发器中,SQL Server 将不允许引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能访问 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 触发器中检索新值,请将 inserted 表与原始更新表联接。当兼容级别是 65 或更低时,对 inserted 或 deleted 表中允许空值的text、ntext 或 image 列,将返回空值;如果这些列不可为空,则返回零长度字符串。
当兼容级别是 80 或更高时,SQL Server 允许在表或视图上通过 INSTEAD OF 触发器更新 text、ntext 或 image 列。
n
是表示触发器中可以包含多条 Transact-SQL 语句的占位符。对于 IF UPDATE (column) 语句,可以通过重复 UPDATE (column) 子句包含多列。
IF UPDATE (column)
测试在指定的列上进行的 INSERT 或 UPDATE 操作,不能用于 DELETE 操作。可以指定多列。因为在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要测试在多个列上进行的 INSERT 或 UPDATE 操作,请在第一个操作后指定单独的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 将返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。
说明 IF UPDATE (column) 子句的功能等同于 IF、IF...ELSE 或 WHILE 语句,并且可以使用 BEGIN...END 语句块。有关更多信息,请参见控制流语言。
可以在触发器主体中的任意位置使用 UPDATE (column)。
column
是要测试 INSERT 或 UPDATE 操作的列名。该列可以是 SQL Server 支持的任何数据类型。但是,计算列不能用于该环境中。有关更多信息,请参见数据类型。
<br
❸ SQL触发器获取刚插入ID
create table info
(
id int identity primary key,
[name] varchar(10)
)
go
create trigger trig_insert
on info for insert
as
begin
declare @id int
select @id=id from inserted
print @id
end
insert into info values('123')
❹ SQl中触发器怎样执行的
创建触发器 是特殊的存储过程,自动执行,一般不要有返回值。
1、后触发器 (AFTER,FOR)先执行对应语句,后执行触发器中的语句。
2、前触发器 并没有真正的执行触发语句(insert,update,delete),而是执行触发后的语句。
3、行级触发器 (FOR EACH ROW) 在SQL server 中不存在。
(4)sql触发器怎么打印扩展阅读:
创建触发的语法
CREATE TRIGGER trigger_name --触发器名称
ON table_name --触发的表
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE] --选择触发器类型
AS --触发后要做的语句
T-SQL语句
GO --结束标记
❺ SQL触发器怎么做
CREATE
TRIGGER
[km]
ON
员工表
AFTER
DELETE
AS
BEGIN
DELETE
FROM
工资表
WHERE
员工编号
IN
(SELECT
员工编号
FROM
deleted)
END
CREATE
TRIGGER
[gf]
ON
员工表
AFTER
UPDATE
AS
BEGIN
UPDATE
工资表
SET
部门编号=(SELECT
部门编号
FROM
inserted)
WHERE
员工编号=(SELECT
员工编号
FROM
inserted)
END
❻ sql的触发器怎么做
这个不能用触发器,要用作业。
打开企业管理器,进入你服务器名下的“管理”,启动SQL Server代理。然后查看服务器属性,选中“自动启动SQL Server代理”。
接下来进入SQL Server代理下的“作业”,在右边点右键选“新建作业”。
在“常规”里,随便输入一个作业名,分类要选最后一项“数据库维护”。
在“步骤”里,点“新建步骤”,随便输入一个步骤名,数据库选成你的数据库,命令里输入你删除记录的语句,也可以通过“打开”来装载T-SQL脚本,弄好后记得分析一下,没有问题再继续。在“高级”里将“失败时的操作”改成“转到下一步”。
在“调度”里,点“新建调度”,随便输入一个调度名,点“更改”,“发生频率”选每天,“一次发生于”里设置17:00:00,然后点“确定”,再点“确定”,再点“确定”,配置就完成了。
❼ 如何设置SQL 触发器
一、什么是PPT中的触发器
1
在通常情况下,用 PowerPoint 制作出来的演示文稿,其播放顺序是固定的,这样就在一定程度上影响了演示文稿的交互性。
❽ 怎样打印出SQL语句
使用PRINT一般是写程序时观察中间结果,对于你说的这种情况,可以直接用SELECT输出结果,在存储过程里也可以这样。如果是在函数或者触发器里,可以建个测试表,如果是表值函数则可以定义一个表变量。
如果一定要print,那么这样吧:
delcare @number int
declare @course nvarchar(30) --for example
select @number=number,@course=course from choice where studentnumber = '20100001'
print @number
print @course
这是楼上的朋友的劳动成果,望勿见怪
如果一定要PRINT全部的,那么用游标吧:
declare @info varchar(200)
declare @curs cursor
set @curs=cursor scroll dynamic
for
select 'number='+convert(varchar(20),number)+'; course='+convert(varchar(20),course) from choice where sex='F'
open @curs
fetch next from @curs into @info
while(@@fetch_status=0)
begin
print @info
fetch next from @curs into @info
end
❾ sql server如何用print语句输出查询结果
1、可以使用如下程序将元组的多个属性输出
DECLARE @t1 NVARCHAR(100) --声明一个变量,接收查询结果值。
SELECT @t1=com_name FROM com WHERE cust_id='20100001' --查询
PRINT @t1 --输出结果值。
SELECT @t1=com_name FROM com WHERE cust_id='1405892'
PRINT @t1
SELECT @t1=com_name FROM com WHERE cust_id='569454'
PRINT @t1
SELECT @t1=com_name FROM com WHERE cust_id='647328'
PRINT @t1
SELECT @t1=com_name FROM com WHERE cust_id='1221889'
PRINT @t1
SELECT @t1=com_name FROM com WHERE cust_id='1255607'
PRINT @t1
2、--向上边的批量select查询,用print输出后,在消息中,还能查看结果。如果不用print,就需要一个一个的复制查询结果。
3、--上边的语句,是在excel和word中拼接和替换值,得到的批量查询语句。
(9)sql触发器怎么打印扩展阅读:
1、不带输出项的print即为输出一个空行,如果之前的print语句输出项的最后用“,”或“;”,则表示其输出是在同一行上。其后面的空的print语句用来消除前面的print语句一直在同一行上输出的效果,使其后面的输出是在下一行。
Print()
功能
以当前字体在打开的打印作业中打印一行或多行文本。
语法Print(printjobnumber,{tab1,}string{,tab2})
例如用在编程中:
定义一个整型数组,将50个随机的两位正整数从下标1开始放入该数组中,求出该数组中具有偶数值的偶数下标元素之和,同时输出该数组中所有元素的值,每行输出10个值。
dim a(50) asinteger
dim i,s asinteger
randomize
s=0
for i=1 to 50
a(i)=int(rnd()*99)+1
if a(i) mod 2=0 then s=s+i
next i
print "s=";s
for i=1 to 50
print a(i);
if i mod 10=0 then print
next i
2、SQL中Print语句用于调试,所以,它输出的内容属于调试信息,类似于出错信息。
3、在不同的编程中,获取调试信息的,方法不同。此外,很少有人用Print作正常的输出,当然,在调试过程中用除外。要输出时,一般用Select语句来得方便一些。多组信息需要输出时,先生成一个临时表,然后向临时表添加,最后把总的临时表数据向前端推送即可。
❿ 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触发器。