推荐用户trigger什么意思

推荐用户trigger什么意思,第1张

"trigger"是英文单词,意思为“触发器”,在计算机领域中常用于指代一种特殊的程序或代码片段,它可以在满足某些条件时自动执行。在软件开发中,“trigger”通常被用来实现数据库 *** 作的自动化处理。

如果说推荐用户 "trigger" 什么意思,可能是指建议用户使用一个触发器(trigger)来实现某个功能。例如,在一个网站上进行注册后需要发送欢迎邮件给新用户,这时就可以编写一个触发器,在新用户注册成功后自动发送欢迎邮件。这样可以提高效率、减少手工 *** 作,并且避免因人为疏忽而导致的错误。

总之,“trigger”是一种非常有用的技术手段,在软件开发和数据管理等方面都有广泛应用。

DML触发器有三类:

1, insert触发器;

2, update触发器;

3, delete触发器;

触发器的组成部分:

触发器的声明,指定触发器定时,事件,表名以类型

触发器的执行,PL/SQL块或对过程的调用

触发器的限制条件,通过where子句实现

类型:

应用程序触发器,前台开发工具提供的;

数据库触发器,定义在数据库内部由某种条件引发;分为:

DML触发器;

数据库级触发器;

替代触发器;

DML触发器组件:

1,触发器定时

2,触发器事件

3,表名

4, 触发器类型

5, When子句

6, 触发器主体

可创建触发器的对象:数据库表,数据库视图,用户模式,数据库实例

创建DML触发器:

Create [or replace] trigger [模式]触发器名

Before| after insert|delete|(update of 列名)

On 表名

[for each row]

When 条件

PL/SQL块

For each row的意义是:在一次 *** 作表的语句中,每 *** 作成功一行就会触发一次;不写的话,表示是表级触发器,则无论 *** 作多少行,都只触发一次;

When条件的出现说明了,在DML *** 作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块;

Insert触发器的创建:

create or replace trigger tg_insert

before insert on student

begin

dbms_outputput_line('insert trigger is chufa le ');

end;

/

执行的效果:

SQL> insert into student

2 values(202,'dongqian','f');

insert trigger is chufa le

update表级触发器的例子:

create or replace trigger tg_updatestudent

after update on student

begin

dbms_outputput_line('update trigger is chufale ');

end;

/

运行效果:

SQL> update student set se='f';

update trigger is chufale

已更新8行;

可见,表级触发器在更新了多行的情况下,只触发了一次;

如果在after update on student后加上

For each row的话就成为行级触发器,运行效果:

SQL> update student set se='m';

update trigger is chufale

update trigger is chufale

update trigger is chufale

update trigger is chufale

update trigger is chufale

update trigger is chufale

update trigger is chufale

update trigger is chufale

已更新8行;

:new 与: old:必须是针对行级触发器的,也就是说要使用这两个变量的触发器一定有for each row

这两个变量是系统自动提供的数组变量,:new用来记录新插入的值,old用来记录被删除的值;

使用insert的时候只有:new里有值;

使用delete的时候只有:old里有值;

使用update的时候:new和:old里都有值;

可以这样使用: dbms_outputput_line('insert trigger is chufa

dbms_outputput_line('new id is : '||:newstui

dbms_outputput_line('new name is : '||:newst

dbms_outputput_line('new se is : '||:newse);

可以这样从数据字典中查看一个表上有哪几个触发器:

SQL> select trigger_name from user_triggers

2 where table_name=upper('student');

TRIGGER_NAME

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

TG_INSERT

TG_UPDATESTUDENT

带有:old变量的行级delete触发器:

create or replace trigger tg_deletestudent

before delete on student

for each row

begin

dbms_outputput_line('old is: '||:oldstuid);

dbms_outputput_line('old name: '||:oldstuname);

end;

/

运行效果:

SQL> delete from student;

old is: 202

old name: dongqian

old is: 101

old name: liudehua

old is: 102

old name: lingqingxia

old is: 103

old name: lichanggong

old is: 104

old name: zhenxiuwen

old is: 1001

old name: lilianjie

old is: 1009

old name: tongleifuck

old is: 203

old name: kfdj

old is: 209

old name: fuck

已删除9行

When的使用:如果在begin也就是说触发器的PL/SQL主体块执行前加上when(oldse=’f’)的话,DML *** 作照做不误,但是只会在删除

Se=’f’的那行的时候才会执行触发器的主体动作,执行效果:

SQL> delete from student;

old is: 209

old name: fuck

已删除9行; 这里虽然删了9行,但是只执行了一次触发器的主体,做为一个行级触发器;

混合类型触发器:

Inserting,deleting,updating三个谓词可以分别指示当前 *** 作到底是哪个;

create or replace trigger hunhetrigger

before insert or update or delete on student

for each row

begin

if inserting then

dbms_outputput_line('insert le');

end if;

if deleting then

dbms_outputput_line('delete le ');

end if;

end;

/

插入的时候就自动判断当前动作为插入:

SQL> insert into student values(303,'me','f');

insert le

删除的时候就自动判断当前动作为删除:

SQL> delete from student;

delete le

注意,既然触发器内部的主体PL/SQL是语句,那么它同样也可以是插入删除 *** 作而不一定只是dbms_output打印一些信息;

这正是日志表的原理:在用户执行了DML语句的时候触发主体为插入日志表以记录 *** 作轨迹的触发器;

为什么用触发器? 当我们有两个表用来记录商品的出库入库情况,good_store用来记录库存的产品类别和数量,

而good_out用来记录出库的产品类别和数量,那么每当我们出库的某个类别的产品一定数量的时候,我们应该在good_out中插入该产品的类别和

出库数量,而同时也应该在good_store表中用update来更新库存的相应类别的产品的数量;这就交给了我们两个必须完成的任务:插入good_out

表后更新good_store表,这样的手工过程使得我们觉得非常ugly,如果只做其中一个那造成数据的不一致;所以现在我们可以用触发器,在

Good_out表的插入 *** 作上绑定一个对good_store进行更新的触发器;当然这个过程应该是一个事务,你不必担心插入good_out表执行了,而绑定在这个动作上的触发器 *** 作不会执行,相信Oracle设计为原子性了;

注意:触发器会使得原来的SQL语句速度变慢;

替代触发器:

创建在视图上的触发器,就是替代触发器,只能是行级触发器;

为什么要用替代触发器?

假如你有一个视图是基于多个表的字段连接查询得到的;现在如果你想直接对着这个视图insert;那你一定在想,我对视图的插入 *** 作

怎么来反应到组成这个视图的各个表中呢?事实上,除了定义一个触发器来绑定在对视图上的插入动作上外,你没有别的办法通过系统的报错而直接向视图中插入数据;这就是我们用替代触发器的原因;替换的意思实际上是触发器的主体部分把对视图的插入 *** 作转换成详细的对各个表的插入;

变异表:变异表就是当前SQL语句正在修改的表,所以在一个变异表上绑定的触发器不可以使用cout()函数,原因很简单:SQL语句刚刚修改了表,你怎么统计??

约束表:

维护:

Alter trigger …disenable; 使得触发器不可用;

Alter trigger ……enable; 开启触发器;

Oracle的内置程序包

扩展数据库的功能;

为PL/SQL提供对SQL功能的访问;

一般具有sys权限的高级管理人员使用;

一个典型的程序包就是dbms_output,你老是用它的过程put_line();

Dbms_standard 提供语言工具;

Dbms_lob *** 作Oracle LOB;就是针对大型数据的 *** 作设计的;

Dbms_lock用户定义的锁;

Dbms_job 允许对PL/SQL过程进行调度;

Dbms_alert 支持数据库事件的异步通知;

1,dbms_output的一些过程:

a):enable

b):disable

c):put只是把数据放到缓存(SQL-Plus的缓存,实际就是整个窗口)中,无输出功能;

d):put_line可以使得以前放在缓存中所有数据输出;并且换到下一行;

e):new_line

f):get_line

g):get_lines

2,dmbs_lob ,这个包只能是由系统管理员来 *** 作;

Clob以字符数据存储可达2G;

Blob以二进制数据存储可达4G;

Nclob以unicode字符存储;

一个文件下载列表的例子:

创建下载目录表:

create table downfilelist

(

id varchar(20) not null primary key,

name varchar(40) not null,

filelocation bfile,

description clob

)

/

创建目录:

create or replace directory filedir as 'f:\oracle'

/只是向Oralce注册了目录,实际上并不会真的建立目录在磁盘上;Oracle无权管理和锁定 *** 作系统的文件系统;

向目录表中插入数据:

insert into downfilelist

values('10001','oracle plsal编程指南',bfilename(upper('filedir'),'demomp3'),'this is a mp3 music')

insert into downfilelist

values('10002','java 大权', bfilename(upper('filedir'),'xjpg'),'good super girl')

/在filedir的目录f:\oracle下实际存储着demomp3 ,xjpg;

注意,如果你试图查询,效果是 :

sys>select from downfilelist;

SP2-0678: 列或属性类型无法通过 SQLPlus 显示

因为第三列是无法显示的,是一个二进制的;

下面使用dbms_lob的一些过程来进行 *** 作:

1,read过程

declare

tempdesc clob;

ireadcount int;

istart int;

soutputdesc varchar(100);

begin

ireadcount:=5;

istart:=1;

select description into tempdesc from downfilelist where id='10001';

dbms_lobread(tempdesc,ireadcount,istart,soutputdesc); 把clob类型的tempdesc中的数据读到字符类型的soutputdesc里;

dbms_outputput_line('Top 5 character is: '||soutputdesc);

end;

/注意,对unicode来说,汉字和字母所占的位数是一样的;

2,getlength函数

select description into tempclob from downfilelist where id=‘10001’;

ilen:=dbms_lobGetLength(tempclob);

append,copy……

发现这样的现象:select x into y的时候,y并不是独立于x的拷贝,因为当修改y的时候x也被修改了;

3, fileexists函数

select id ,dbms_lobfileexists(filelocation) from downfilelist;

如果在bfile类型字段filelocation指定的系统下的目录中存在filelocation指定的系统文件,则返回int 1,否则返回0;

这说明Oracle还是可以检测到系统的文件情况的,如同javaio包里的类一样;

对bfile类型数据的 *** 作函数有fileisopen,fileopen,fileclose等等;

如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!

vaela

建立两个单域的表格。一个表格中为姓名列表(表格名:data)。

另一个表格中是所插入字符的字符数(表格名:chars)。在data表格中定义一个触发器。

每次在其中插入一个新姓名时,chars表格中运行的总数就会根据新插入记录的字符数目进行自动更新。

(见列表A)

mysql> CREATE TABLE data (name VARCHAR(255));

Query OK, 0 rows affected (009 sec)

mysql> CREATE TABLE chars (count INT(10));

Query OK, 0 rows affected (007 sec)

mysql> INSERT INTO chars (count) VALUES (0);

Query OK, 1 row affected (000 sec)

mysql> CREATE TRIGGER t1 AFTER INSERT ON

data FOR EACH ROW UPDATE chars SET count = count + CHAR_LENGTH(NEWname);

Query OK, 0 rows affected (001 sec)

列表A

理解上面代码的关键在于CREATE TRIGGER命令,被用来定义一个新触发器。这个命令建立一个新触发器,假定的名称为t1,每次有一个新记录插入到data表格中时,t1就被激活。

在这个触发器中有两个重要的子句:

AFTER INSERT子句表明触发器在新记录插入data表格后激活。

UPDATE chars SET count = count + CHAR_LENGTH(NEWname)子句表示触发器激活后执行的SQL命令。在本例中,该命令表明用新插入的dataname域的字符数来更新 charscount栏。这一信息可通过内置的MySQL函数CHAR_LENGTH()获得。

放在源表格域名前面的NEW关键字也值得注意。这个关键字表明触发器应考虑域的new值(也就是说,刚被插入到域中的值)。MySQL还支持相应的OLD前缀,可用它来指域以前的值。

可以通过调用SHOW TRIGGER命令来检查触发器是否被激活,如列表B所示。

mysql> SHOW TRIGGERS\G

1 row

Trigger: t1

Event: INSERT

Table: data

Statement: UPDATE chars SET count = count + CHAR_LENGTH(NEWname)

Timing: AFTER

Created: NULL

ql_mode:

1 row in set (001 sec)

列表B

激活触发器后,开始对它进行测试。试着在data表格中插入几个记录:

mysql> INSERT INTO data (name) VALUES ('Sue'), ('Jane');

Query OK, 2 rows affected (000 sec)

Records: 2Duplicates: 0Warnings: 0

然后检查chars表格看触发器是否完成它该完成的任务:

mysql> SELECT FROM chars;

+-------+

| count |

+-------+

| 7|

+-------+

1 row in set (000 sec)

data表格中的INSERT命令激活触发器,计算插入记录的字符数,并将结果存储在chars表格中。如果往data表格中增加另外的记录,charscount值也会相应增加。

触发器应用完毕后,可有DROP TRIGGER命令轻松删除它。

mysql> DROP TRIGGER t1;

Query OK, 0 rows affected (000 sec)

注意:理想情况下,你还需要一个倒转触发器,每当一个记录从源表格中删除时,它从字符总数中减去记录的字符数。这很容易做到,你可以把它当作练习来完成。提示:应用BEFORE DELETE ON子句是其中一种方法。

现在,要建立一个审计记录来追踪对这个表格所做的改变。这个记录将反映表格的每项改变,并向用户说明由谁做出改变以及改变的时间。需要建立一个新表格来存储这一信息(表格名:audit),如下所示。(列表C)

mysql> CREATE TABLE audit (id INT(7), balance FLOAT, user VARCHAR(50)

NOT NULL, time TIMESTAMP NOT NULL);

Query OK, 0 rows affected (009 sec)

列表C

接下来,我将在accounts表格中定义一个触发器。(列表D)

mysql> CREATE TRIGGER t1 AFTER UPDATEON accounts

FOR EACH ROW INSERT INTO audit (id, balance, user, time)

VALUES (OLDid, NEWbalance, CURRENT_USER(), NOW());

Query OK, 0 rows affected (004 sec)

列表D

要是已经走到这一步,就很容易理解。accounts表格每经历一次UPDATE,触发器插入(INSERT)对应记录的id、新的余额、当前时间和登录audit表格的用户的名称。

实现中的例子:用触发器审计记录

既然了触发器的基本原理,来看一个稍稍复杂的例子。常用触发器来建立一个自动“审计记录”,以记录各种用户对数据库的更改。为了解审计记录的实际应用,请看下面的表格(表格名:accounts),它列出了一个用户的三个银行账户余额。(表A)

mysql> SELECT FROM accounts;

+----+------------+---------+

| id | label| balance |

+----+------------+---------+

|1 | Savings #1 |500 |

|2 | Current #1 |2000 |

|3 | Current #2 |3500 |

+----+------------+---------+

3 rows in set (000 sec)

表A

然后,检查触发器是否被激活:

mysql> SHOW TRIGGERS \G

1 row

Trigger: t1

Event: UPDATE

Table: accounts

Statement: INSERT INTO audit (id, balance, user, time)

VALUES (OLDid, NEWbalance, CURRENT_USER(), NOW())

Timing: AFTER

Created: NULL

Sql_mode:

1 row in set (001 sec)

再来看最后的结果(列表E):

mysql> UPDATE accounts SET balance = 500 WHERE id = 1;

Query OK, 1 row affected (000 sec)

Rows matched: 1Changed: 1Warnings: 0

mysql> UPDATE accounts SET balance = 900 WHERE id = 3;

Query OK, 1 row affected (001 sec)

Rows matched: 1Changed: 1Warnings: 0

mysql> UPDATE accounts SET balance = 1900 WHERE id = 1;

Query OK, 1 row affected (000 sec)

Rows matched: 1Changed: 1Warnings: 0

列表E

注意,对accounts表格所作的改变已被记录到audit表格中,将来如果出现问题,可以方便地从中进行恢复。

mysql> SELECT FROM audit;

+------+---------+----------------+---------------------+

| id| balance | user| time|

+------+---------+----------------+---------------------+

|1 |500 | root@localhost | 2006-04-22 12:52:15 |

|3 |900 | root@localhost | 2006-04-22 12:53:15 |

|1 |1900 | root@localhost | 2006-04-22 12:53:23 |

+------+---------+----------------+---------------------+

3 rows in set (000 sec)

我有一个带有名为“NOTES”的STRING类型列的sqlite表我想创建一个自动更新NOTES列内容的触发器,但不会完全替换它

触发器(Trigger)是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。

触发器(Trigger)的要点:

SQLite 的触发器(Trigger)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。

SQLite 只支持 FOR EACH ROW 触发器(Trigger),没有 FOR EACH STATEMENT 触发器(Trigger)。因此,明确指定 FOR EACH ROW 是可选的。

WHEN 子句和触发器(Trigger)动作可能访问使用表单 NEWcolumn-name 和 OLDcolumn-name 的引用插入、删除或更新的行元素,其中 column-name 是从与触发器关联的表的列的名称。

如果提供 WHEN 子句,则只针对 WHEN 子句为真的指定行执行 SQL 语句。如果没有提供 WHEN 子句,则针对所有行执行 SQL 语句。

BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。

当触发器相关联的表删除时,自动删除触发器(Trigger)。

要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 databasetablename。

一个特殊的 SQL 函数 RAISE() 可用于触发器程序内抛出异常。

--去掉这个就OK了while(1=1),你这是死循环啊!!!,你也没搞游标啊

create trigger mydata on Data for insert 

as

begin

    declare @status varchar(255),@dataID int

    select @dataID=DataID from inserted

    set @status=''

    

    if (select data from Data where DataID=@dataID and Type=1)>370

    set @status='发烧'

    

    if(select data from Data where DataID=@dataID and Type=2)<6

    set @status=@status+'睡眠质量差'

     

    update Data set status=@status where DataID=@dataID

end

--建议你的存储过程写成这样啊

create trigger mydata on Data for insert 

as

begin

update Data set status=

Case When AType=1 And Adata>370 Then '发烧' else '' End+

Case When AType=2 And Adata<6 then '睡眠质量差' else '' End 

From Data A inner join inserted B  

on ADataID=BDataID

End

以上就是关于推荐用户trigger什么意思全部的内容,包括:推荐用户trigger什么意思、有关sql insert触发器和update触发器、mysql数据库触发器,怎么做满足条件触发等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9513110.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存