触发器语句
sql 触发器语法

sql 触发器语法一、什么是 SQL 触发器?SQL 触发器是一种特殊的存储过程,它在特定的数据库操作(如INSERT、UPDATE 或DELETE)执行时自动触发。
当满足特定条件时,触发器可以在表上执行操作或调用其他存储过程。
二、SQL 触发器的语法SQL 触发器的语法如下:CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE}ON table_name [FOR EACH ROW]BEGIN-- 触发器执行的 SQL 语句END;其中:- trigger_name:触发器名称,用户自定义。
- BEFORE/AFTER:指定触发时间,即在数据库操作之前或之后执行。
- INSERT/UPDATE/DELETE:指定触发事件,即在进行插入、更新或删除操作时执行。
- table_name:指定要监视的表名。
- FOR EACH ROW:可选参数,表示为每一行数据都会执行此触发器。
- BEGIN 和 END:包含了要执行的 SQL 语句。
三、SQL 触发器示例1. 创建一个在插入数据时自动更新修改日期的触发器:CREATE TRIGGER update_dateBEFORE INSERT ON usersFOR EACH ROWBEGINSET NEW.modify_date = NOW();END;2. 创建一个在删除订单时自动将订单中商品数量归零的触发器:CREATE TRIGGER reset_quantityAFTER DELETE ON ordersFOR EACH ROWBEGINUPDATE products SET quantity = 0 WHERE product_id = OLD.product_id;END;3. 创建一个在更新用户信息时自动记录修改日志的触发器:CREATE TRIGGER log_changesAFTER UPDATE ON usersFOR EACH ROWBEGININSERT INTO user_logs (user_id, change_date, change_type) VALUES (er_id, NOW(), 'update');END;四、SQL 触发器的注意事项1. 触发器应该尽可能简单,避免使用复杂的逻辑。
sql server触发器的基本语法和使用方法

sql server触发器的基本语法和使用方法一、引言SQL Server触发器是一种数据库对象,它在数据库表上定义在特定事件发生时自动执行的操作。
触发器基于定义的事件和条件进行触发,并执行一系列预定的操作。
本文将介绍SQL Server触发器的基本语法和使用方法,帮助您更好地理解和应用触发器。
二、触发器的语法触发器的语法主要由以下几个部分组成:1. 触发器名称:指定触发器的名称,以便在创建触发器时进行命名和识别。
2. 触发器事件:指定触发器应何时触发,常见的触发器事件包括INSERT、UPDATE和DELETE等。
3. 触发器模式:指定触发器在事件发生时执行的操作,包括对表数据的插入、更新和删除等操作。
4. 触发器所在的架构:指定触发器所在的架构,以便在创建触发器时指定正确的架构。
基本语法示例:CREATE TRIGGER trigger_name ON table_name FOR INSERT, UPDATE, DELETE AS BEGIN -- 触发器操作代码 END;三、触发器的使用方法1. 创建触发器:使用CREATE TRIGGER语句创建触发器,指定触发器的名称、事件、模式和所在的架构。
2. 禁用和启用触发器:使用ALTER TRIGGER语句来禁用和启用触发器,以满足特定需求或临时更改触发器的行为。
3. 修改触发器:使用ALTER TRIGGER语句修改现有触发器的名称、事件、模式和位置等属性。
4. 删除触发器:使用DROP TRIGGER语句删除不再需要的触发器。
5. 触发器的嵌套:在触发器内部可以定义其他触发器,形成嵌套结构,实现更复杂的逻辑。
6. 触发器的权限:确保创建、修改和删除触发器的用户具有足够的权限。
7. 异常处理:在触发器操作代码中添加适当的异常处理机制,以应对可能出现的错误和异常情况。
四、示例以下是一个简单的示例,展示如何使用SQL Server触发器在表上定义一个插入操作时自动添加日志:1. 创建表:首先创建一个包含要记录的字段的表。
SQL触发器常用语句

SQL触发器常⽤语句⼀、创建⼀个简单的触发器CREATE TRIGGER 触发器名称ON 表名FOR INSERT、UPDATE 或 DELETEAST-SQL 语句注意:触发器名称是不加引号的。
gocreate TRIGGER Trigger_Insert_Test --创建触发器的名称ON Test --给哪个表创建触发器FOR INSERT --触发⽅法:INSERT|UPDATE|DELETEasbegininsert into OprationSyncLog select'Test',id,GETDATE(),'insert','0'from inserted order by id --需要做的事情end⼆、删除触发器drop trigger 触发器名称删除多个触发器:drop trigger 触发器名称,触发器名称三、重命名触发器⽤查询分析器重命名exec sp_rename 原名称, 新名称sp_rename 是 SQL Server? ⾃带的⼀个存储过程,⽤于更改当前数据库中⽤户创建的对象的名称,如表名、列表、索引名等。
四、INSERT、UPDATE 或 DELETEINSTEAD OF执⾏触发器语句,但不执⾏触发触发器的 SQL 语句,⽐如试图删除⼀条记录时,将执⾏触发器指定的语句,此时不再执⾏ delete 语句。
例:create trigger fon tblinstead of deleteasinsert into Logs...IF UPDATE(列名)检查是否更新了某⼀列,⽤于 insert 或 update,不能⽤于 delete。
例:create trigger fon tblfor updateasif update(status) or update(title)sql_statement --更新了 status 或 title 列inserted、deleted这是两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录形成的表,deleted 保存的是 delete 或 update 之前所影响的记录形成的表。
简单使用触发器SQL触发器的使用及语法

简单使用触发器SQL触发器的使用及语法SQL触发器是一种特殊类型的存储过程,它是在数据库中一些特定的操作发生时自动执行的。
触发器可以用于在数据被插入、更新或删除时执行一系列的操作。
本文将详细介绍SQL触发器的使用和语法。
1.触发器的类型:SQL触发器可以分为三种类型:插入触发器(INSERT trigger)、更新触发器(UPDATE trigger)和删除触发器(DELETE trigger)。
根据业务需求选择相应的触发器类型。
2.创建触发器:创建触发器需要使用CREATETRIGGER语句。
语法如下:CREATE TRIGGER <trigger_name>{BEFORE,AFTER,INSTEADOF}{INSERT,UPDATE,DELETE}[ON <table_name>][FOREACHROW][WHEN (<condition>)]BEGIN--触发器执行的操作END;其中,trigger_name是触发器的名称;BEFORE / AFTER / INSTEAD OF表示触发器在所指定操作之前、之后或者代替进行;INSERT / UPDATE/ DELETE表示触发器响应的操作类型;table_name是触发器所绑定的表名;FOR EACH ROW表示该触发器对每一行数据都执行;condition是触发器的条件。
3.触发器执行的操作:在触发器的BEGIN和END之间,可以进行一系列的操作,如执行SQL 语句、调用存储过程等。
可以根据业务需求在触发器中编写逻辑代码来满足需求。
4.触发器的应用场景:-数据完整性:可以使用触发器在插入、更新或删除数据时进行一些验证,确保数据的完整性。
例如,在插入新用户之前,可以在触发器中检查用户的必填字段是否为空。
-数据同步:可以使用触发器在数据更新时自动更新其他相关表中的数据,确保数据的同步。
例如,在更新订单信息时,可以在触发器中更新库存表中的相应数据。
sql 触发器格式

sql 触发器格式SQL触发器(Trigger)是一种特殊的存储过程,它在指定的表上执行指定的操作(例如INSERT、UPDATE 或DELETE)时自动执行。
触发器可以用于执行比简单的SQL 语句更复杂的数据完整性操作。
触发器的创建语法因数据库管理系统(DBMS)的不同而有所差异,但大多数SQL 数据库系统都遵循类似的模式。
以下是一个通用的触发器创建示例,用于在向orders 表插入新记录时自动更新order_count 列:SQLCREATE TRIGGER order_count_triggerAFTER INSERT ON ordersFOR EACH ROWBEGINUPDATE inventorySET order_count = order_count + 1WHERE product_id = NEW.product_id;END;在上述示例中:•CREATE TRIGGER order_count_trigger:创建名为order_count_trigger 的触发器。
•AFTER INSERT ON orders:指定触发器在向orders 表插入新记录后执行。
•FOR EACH ROW:指定触发器对每一行数据执行一次。
•BEGIN ... END;:包含触发器实际执行的SQL 语句。
在此示例中,触发器会更新inventory 表中的order_count 列。
•NEW.product_id:引用新插入的记录的product_id 值。
请注意,上述示例是一个简化的示例,实际的触发器语法可能会根据您使用的特定数据库系统(如MySQL、PostgreSQL、Oracle 或SQL Server)而有所不同。
在创建触发器之前,请务必参考您所使用的数据库系统的官方文档,以了解正确的语法和可用选项。
sql查询触发器语句

sql查询触发器语句SQL触发器是一种特殊的数据库对象,它可以在特定的数据库操作(例如插入、更新、删除)发生时自动执行一些预定义的动作。
触发器可以用于实现复杂的业务逻辑和数据完整性约束。
下面列举了10个常见的SQL触发器语句:1. 在员工表上创建触发器,当有新员工加入时,自动在工资表中插入一条新记录:```sqlCREATE TRIGGER insert_employeeAFTER INSERT ON employeesFOR EACH ROWBEGININSERT INTO salaries (employee_id, salary) VALUES (NEW.employee_id, 0);END;```2. 在订单表上创建触发器,当订单状态更新为已发货时,自动更新库存表中对应商品的数量:```sqlCREATE TRIGGER update_inventoryAFTER UPDATE ON ordersFOR EACH ROWBEGINIF NEW.status = '已发货' THENUPDATE inventory SET quantity = quantity - NEW.quantity WHERE product_id = NEW.product_id;END IF;END;```3. 在学生表上创建触发器,当有新学生加入时,自动更新班级表中的学生人数:```sqlCREATE TRIGGER update_class_sizeAFTER INSERT ON studentsFOR EACH ROWBEGINUPDATE classes SET size = size + 1 WHERE class_id = NEW.class_id;END;```4. 在商品表上创建触发器,当商品数量低于阈值时,自动发送库存警报邮件:```sqlCREATE TRIGGER send_inventory_alertAFTER UPDATE ON productsFOR EACH ROWBEGINIF NEW.quantity < 10 THEN-- 发送邮件的逻辑END IF;END;```5. 在订单表上创建触发器,当订单被删除时,自动将对应的商品数量加回库存:```sqlCREATE TRIGGER restore_inventoryAFTER DELETE ON ordersFOR EACH ROWBEGINUPDATE inventory SET quantity = quantity + OLD.quantity WHERE product_id = OLD.product_id;END;```6. 在员工表上创建触发器,当员工的工资被更新时,自动记录工资变动历史:```sqlCREATE TRIGGER log_salary_changeAFTER UPDATE ON employeesFOR EACH ROWBEGININSERT INTO salary_history (employee_id, old_salary, new_salary, change_date) VALUES (NEW.employee_id, OLD.salary, NEW.salary, NOW());END;```7. 在订单表上创建触发器,当有新订单完成支付时,自动更新销售统计表中的数据:```sqlCREATE TRIGGER update_sales_statsAFTER INSERT ON ordersFOR EACH ROWBEGINIF NEW.status = '已支付' THENUPDATE sales_stats SET total_sales = total_sales +NEW.total_amount, order_count = order_count + 1;END IF;END;```8. 在学生表上创建触发器,当学生的成绩被更新时,自动计算并更新班级的平均成绩:```sqlCREATE TRIGGER update_class_avg_scoreAFTER UPDATE ON studentsFOR EACH ROWBEGINUPDATE classes SET avg_score = (SELECT AVG(score) FROM students WHERE class_id = NEW.class_id) WHERE class_id = NEW.class_id;END;```9. 在商品表上创建触发器,当商品被删除时,自动更新订单表中的商品信息:```sqlCREATE TRIGGER update_order_productAFTER DELETE ON productsFOR EACH ROWBEGINUPDATE orders SET product_id = NULL WHERE product_id = OLD.product_id;END;```10. 在员工表上创建触发器,当员工的状态从在职变为离职时,自动将该员工从项目表中移除:```sqlCREATE TRIGGER remove_employee_from_projectAFTER UPDATE ON employeesFOR EACH ROWBEGINIF NEW.status = '离职' THENDELETE FROM projects WHERE employee_id = NEW.employee_id;END IF;END;```以上是10个常见的SQL触发器语句的示例,它们展示了触发器的灵活应用,可以帮助我们实现复杂的业务逻辑和数据完整性约束。
数据库触发器判断语句

数据库触发器判断语句数据库触发器是一种数据库对象,能够在特定的事件发生时自动执行某些操作。
触发器可以帮助数据库管理人员更好地控制和管理数据库中的信息。
在触发器中使用判断语句是非常重要的,可以帮助我们避免一些错误操作和数据插入。
下面将详细介绍如何在数据库触发器中使用判断语句。
1. 检查插入数据的合法性在触发器中使用判断语句来检查插入数据的合法性是非常必要的。
例如,在向一个订单表中插入数据时,我们可以使用判断语句来检查这个订单是否已经存在;如果存在,则拒绝插入这个订单。
以下是示例代码:IF EXISTS (SELECT * FROM orders WHERE order_id =inserted.order_id)BEGINROLLBACK TRANSACTIONPRINT 'Order already exists, insert failed!'END2. 检查数据的完整性在触发器中使用判断语句来检查数据的完整性是非常重要的。
例如,在向一个员工表中插入数据时,我们可以使用判断语句来检查该员工的身份证号码是否已经存在;如果存在,则拒绝插入该员工的数据。
以下是示例代码:IF EXISTS (SELECT * FROM employees WHERE id_num =inserted.id_num)BEGINROLLBACK TRANSACTIONPRINT 'Employee id_num already exists, insert failed!'END3. 检查数据的正确性在触发器中使用判断语句来检查数据的正确性是非常重要的。
例如,在向一个学生表中插入数据时,我们可以使用判断语句来检查每个学生的年龄是否符合要求;如果不符合,则拒绝插入该学生的数据。
以下是示例代码:IF inserted.age < 0 OR inserted.age > 150BEGINROLLBACK TRANSACTIONPRINT 'Invalid age, insert failed!'END4. 检查数据的更新操作在触发器中使用判断语句来检查数据的更新操作是非常重要的。
trigger的用法总结

Trigger的用法总结1. 什么是Trigger?Trigger(触发器)是数据库管理系统中的一种特殊的存储过程,它在定义的事件发生时自动执行。
触发器可以在插入、更新或删除数据时触发,可以用于实现数据的完整性约束、自动化业务逻辑等功能。
2. 触发器的语法触发器的语法可以根据具体的数据库管理系统有所差异,下面是一个通用的触发器语法:CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name[FOR EACH ROW][WHEN (condition)]BEGIN-- 触发器的执行逻辑END;•trigger_name:触发器的名称,应具有唯一性。
•BEFORE或AFTER:指定触发器的执行时间,BEFORE表示在事件之前执行,AFTER表示在事件之后执行。
•INSERT、UPDATE或DELETE:指定触发器要监控的事件类型。
•table_name:要监控的表名。
•FOR EACH ROW:表示触发器针对每一行数据都会执行,可以省略。
•WHEN (condition):指定触发器的条件,只有满足条件时触发器才会执行,可以省略。
•BEGIN和END:触发器的执行逻辑应该放在BEGIN和END之间。
3. 触发器的重要观点3.1 触发器的类型根据触发器的执行时间,可以将触发器分为两种类型:BEFORE触发器和AFTER触发器。
•BEFORE触发器:在事件之前执行,可以用于验证数据的完整性、修改数据等操作。
例如,可以在插入数据之前检查数据的有效性,或者在更新数据之前对数据进行预处理。
•AFTER触发器:在事件之后执行,可以用于记录日志、发送通知等操作。
例如,可以在插入数据之后记录操作日志,或者在删除数据之后发送邮件通知。
3.2 触发器的事件类型触发器可以监控的事件类型包括:•INSERT:插入数据时触发。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
您还未登录!|登录|注册|帮助CSDN首页资讯论坛博客下载搜索更多CTO俱乐部学生大本营培训充电移动开发软件研发云计算程序员ITeyeTUPchinayuan的专栏目录视图摘要视图订阅精创之作《雷神的微软平台安全宝典》诚邀译者移动业界领袖会议·上海·6.20CSDN博客频道“移动开发之我见”主题征文活动【分享季1】:网友推荐130个经典资源,分享再赠分!数据库触发器分类:数据库2011-03-31 18:00 2889人阅读评论(2) 收藏举报触发器Oracle 触发器:触发器是特定事件出现的时候,自动执行的代码块。
类似于存储过程,但是用户不能直接调用他们。
功能:1 、允许/ 限制对表的修改2 、自动生成派生列,比如自增字段3 、强制数据一致性4 、提供审计和日志记录5 、防止无效的事务处理6 、启用复杂的业务逻辑开始:create trigger biufer_employees_department_idbefore insert or updateof department_idon employeesreferencing old as old_valuenew as new_valuefor each rowwhen (new_value.department_id<>80 )begin:new_mission_pct :=0;end;/触发器的组成部分:1 、触发器名称2 、触发语句3 、触发器限制4 、触发操作1 、触发器名称create trigger biufer_employees_department_id命名习惯:biufer (before insert update for each row )employees 表名department_id 列名2 、触发语句比如:表或视图上的DML 语句;DDL 语句,数据库关闭或启动,startup shutdown 等等before insert or updateof department_idon employeesreferencing old as old_valuenew as new_valuefor each row说明:( 1 )、无论是否规定了department_id ,对employees 表进行insert 的时候( 2 )、对employees 表的department_id 列进行update 的时候3 、触发器限制when (new_value.department_id<>80 )限制不是必须的。
此例表示如果列department_id 不等于80 的时候,触发器就会执行。
其中的new_value 是代表跟新之后的值。
4 、触发操作是触发器的主体begin:new_mission_pct :=0;end;主体很简单,就是将更新后的commission_pct 列置为0触发:insert into employees(employee_id,last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct ) values( 12345,‟Chen‟,‟Donny‟, sysdate, 12, …donny@‟,60,10000,.25);select commission_pct from employees where employee_id=12345;触发器不会通知用户,便改变了用户的输入值。
触发器类型:1 、语句触发器2 、行触发器3 、INSTEAD OF 触发器4 、系统条件触发器5 、用户事件触发器1 、语句触发器是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。
能够与INSERT 、UPDA TE 、DELETE 或者组合上进行关联。
但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。
比如,无论update 多少行,也只会调用一次update 语句触发器。
例子:需要对在表上进行DML 操作的用户进行安全检查,看是否具有合适的特权。
Create table foo(a number);Create trigger biud_fooBefore insert or update or deleteOn fooBeginIf user not in (…DONNY‟) thenRaise_application_error(-20001, …Y ou don‟t have access to modify this table.‟);End if;End;/即使SYS ,SYSTEM 用户也不能修改foo 表[ 试验]对修改表的时间、人物进行日志记录。
1 、建立试验表create table employees_copy as select *from hr.employees2 、建立日志表create table employees_log( who varchar2(30), when date);3 、在employees_copy 表上建立语句触发器,在触发器中填充employees_log 表。
Create or replace trigger biud_employee_copyBefore insert or update or deleteOn employees_copyBeginInsert into employees_log( Who,when) V alues( user, sysdate);End;/4 、测试update employees_copy set salary= salary*1.1;select *from employess_log;5 、确定是哪个语句起作用?即是INSERT/UPDA TE/DELETE 中的哪一个触发了触发器?可以在触发器中使用INSERTING / UPDA TING / DELETING 条件谓词,作判断:beginif inserting then-----elsif updating then-----elsif deleting then------end if;end;if updating(…COL1‟) or updating(…COL2‟) then------end if;[ 试验]1 、修改日志表alter table employees_log add (action varchar2(20));2 、修改触发器,以便记录语句类型。
Create or replace trigger biud_employee_copyBefore insert or update or deleteOn employees_copyDeclareL_action employees_log.action%type;Beginif inserting thenl_action:=‟Insert‟;elsif updating thenl_action:=‟Update‟;elsif deleting thenl_action:=‟Delete‟;elseraise_application_error(-20001,‟Y ou should never ever get this error.‟);Insert into employees_log( Who,action,when) V alues( user, l_action,sysdate); End;/3 、测试insert into employees_copy( employee_id, last_name, email, hire_date, job_id)values(12345,‟Chen‟,‟Donny@hotmail‟,sysdate,12);select *from employees_logupdate employees_copy set salary=50000 where employee_id = 12345;2 、行触发器是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外:1 、定义语句中包含FOR EACH ROW 子句2 、在BEFORE ……FOR EACH ROW 触发器中,用户可以引用受到影响的行值。
比如:定义:create trigger biufer_employees_department_idbefore insert or updateof department_idon employees_copyreferencing old as old_valuenew as new_valuefor each rowwhen (new_value.department_id<>80 )begin:new_mission_pct :=0;end;/Referencing 子句:执行DML 语句之前的值的默认名称是:old , 之后的值是:newinsert 操作只有:newdelete 操作只有:oldupdate 操作两者都有referencing 子句只是将new 和old 重命名为new_value 和old_value ,目的是避免混淆。
比如操作一个名为new 的表时。
作用不很大。
[ 试验] :为主健生成自增序列号drop table foo;create table foo(id number, data varchar2(20));create sequence foo_seq;create or replace trigger bifer_foo_id_pkbefore insert on foofor each rowbeginselect foo_seq.nextval into :new.id from dual;end;/insert into foo(data) values(…donny‟);insert into foo values(5,‟Chen‟);select * from foo;3 、INSTEAD OF 触发器更新视图instead of 触发器,可以实现: 不执行导致trigger 触发的语句,而只执行触发器. INSTEAD OF triggers provide a transparent way of modifying views that cannot be modified directly through DML statements (INSERT, UPDA TE, and DELETE). These triggers are called INSTEAD OF triggers because, unlike other types of triggers, Oracle fires the trigger instead of executing the triggering statement. Y ou can write normal INSERT, UPDA TE, and DELETE statements against the view and the INSTEAD OF trigger is fired to update the underlying tables appropriately. INSTEAD OF triggers are activated for each row of the view that gets modified.Create or replace view company_phone_book asSelect first_name||‟, ‟||last_name name, email, phone_number,employee_id emp_idFrom hr.employees;尝试更新email 和nameupdate pany_phone_book set name=‟Chen1, Donny1‟ where emp_id=100create or replace trigger update_name_company_phone_bookINSTEAD OFUpdate on pany_phone_bookBeginUpdate hr.employeesSet employee_id=:new.emp_id,First_name=substr(:, instr(:,‟,‟)+2),last_name= substr(:,1,instr(:,‟,‟)-1),phone_number=:new.phone_number,email=:new.emailwhere employee_id=:old.emp_id;end;instead of trigger 是基于视图建立的, 不能建在表上, 为什么要建在视图上, 一般的视图如果其数据来源一个表并且包含该表的主键, 就可以对视图进行DML 操作. 另外一种情况是从多个表查询出来的. 这样我们就不能对视图进行操作了, 也就是只能查询.instead of trigger 可以解决建在多表上视图的更新操作.下面我们就来实例操作:a. 先建表, 简单点就三个分别是学生表, 课程表, 学生选课表CREA TE TABLE STUDENT(CODE V ARCHAR2(5),LNAME V ARCHAR2(200))CREA TE TABLE COURSE(CODE V ARCHAR2(5),CNAME V ARCHAR2(30))CREA TE TABLE ST_CR(STUDENT V ARCHAR2(5),COURSE V ARCHAR2(5),GRADE NUMBER)-- 表的约束ALTER TABLE STUDENT ADD CONSTRAINT STUDENT$PK PRIMARY KEY(CODE); ALTER TABLE COURSE ADD CONSTRAINT COURSE$PK PRIMARY KEY(CODE); ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$PK PRIMARY KEY(STUDENT, COURSE);ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$FK$STUDENT FOREIGN KEY(STUDENT) REFERENCES STUDENT(CODE);ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$FK$COURSE FOREIGN KEY(COURSE) REFERENCES COURSE(CODE);b. 基于这三个表的视图CREA TE OR REPLACE VIEW STUDENT_STA TUS ASSELECT S.CODE S_CODE, S.LNAME STUDENT, C.CODE C_CODE, AME COURSE, SC.GRADE GRADEFROM STUDENT S, COURSE C, ST_CR SCWHERE S.CODE = SC.STUDENTAND C.CODE = SC.COURSEc. 基于视图的触发器CREA TE OR REPLACE TRIGGER TRI_STCR INSTEAD OF INSERT ON STUDENT_STA TUSFOR EACH ROWDECLAREW_ACTION V ARCHAR2(1);BEGINIF INSERTING THENW_ACTION := 'I';ELSERAISE PROGRAM_ERROR;END IF;INSERT INTO STUDENT(CODE, LNAME) V ALUES(:NEW.S_CODE,:NEW.STUDENT);INSERT INTO COURSE(CODE, CNAME) V ALUES(:NEW.C_CODE, :NEW.COURSE);INSERT INTO ST_CR(STUDENT, COURSE, GRADE)V ALUES(:NEW.S_CODE, :NEW.C_CODE, :NEW.GRADE);END;d. 对视图执行数据插入INSERT INTO STUDENT_STA TUS(S_CODE, STUDENT, C_CODE, COURSE, GRADE)V ALUES('001','Mike','EN','English',86);可以看到每个表各有一条数据已经插入.4 、系统事件触发器系统事件:数据库启动、关闭,服务器错误create trigger ad_startupafter startupon databasebegin-- do some stuffend;/5 、用户事件触发器用户事件:用户登陆、注销,CREA TE / ALTER / DROP / ANALYZE / AUDIT / GRANT / REVOKE / RENAME / TRUNCA TE / LOGOFF例子:记录删除对象1. 日志表create table droped_objects(object_name varchar2(30),object_type varchar2(30),dropped_on date);2 .触发器create or replace trigger log_drop_triggerbefore drop on donny.schemabegininsert into droped_objects values(ora_dict_obj_name, -- 与触发器相关的函数ora_dict_obj_type,sysdate);end;/3. 测试create table drop_me(a number);create view drop_me_view as select *from drop_me;drop view drop_me_view;drop table drop_me;select *from droped_objects禁用和启用触发器alter trigger <trigger_name> disable;alter trigger <trigger_name> enable;事务处理:在触发器中,不能使用commit / rollback, 因为ddl 语句具有隐式的commit ,所以也不允许使用视图:dba_triggersMS SQLServer 触发器:SQL Sever 2005 包含的3 个触发器对象:AFTER ,数据定义语言(DDL) 和INSTEAD-OF1.AFTER 触发器是存储程序,它发生于数据操作语句作用之后,例如删除语句等。