授权与触发器
授权
grant [权限列表] on [对象类型,对象名] to user
with grant option;
- with grant option:允许将此权限赋给其他用户
收回
revoke [权限列表] on [对象类型,对象名] from user
[restrict | cascade];
- restrict:表示只收回语句中指定的用户的权限
- cascade:表示除了收回指定用户的权限外,还收回该用户赋予的其他用户的权限。
触发器
特点
- 当数据库程序员声明的事件发生时,触发器被激活。声明的事件可以是对某个特定关系的插入、删除或更新。
- 当触发器被事件激活时,不是立即执行,而是首先由触发器测试触发条件,如果事件不成立,响应该事件的触发器什么都不做。
- 如果触发器声明的条件满足,则与该触发器相连的动作由DBMS执行。动作可以阻止事件发生,可以撤销事件。
- 触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器;
- 不能在临时表或系统表上创建触发器,但触发器可以引用临时表
创建
create trigger <name>
[before | after]
[delete | insert | update/update of 列名清单]
on <table_name>
[referencing <临时视图名>]
[for each row | for eahc statement]
[when <触发条件>]
begin
<触发动作>
end[触发器名称]
- referencing:提供两个临时视图,分别为更新前后的值
- 行级触发器:old row | new row
- 行级触发器是指一条SQL语句影响的每一行触发一次
- 语句级触发器:old table | new table
- 语句级触发器是指一条SQL语句触发一次
- 行级触发器:old row | new row
- for each row
- 行级触发器
- for eahc statement
- 语句级触发器,默认
修改与删除
修改:create改alter
删除:drop trigger 名称;
嵌入式SQL与存储过程
嵌入式SQL
SQL提供了将SQL语句嵌入到某种高级语言中的方式,通常采用预编译的方法。
- 区分主语言与SQL语句的方式
- EXEC SQL <SQL语句>
- 向主语言传递SQL语句执行的状态信息的方式
- SQLCA,即SQL通信区,是系统默认定义的全局变量。SQLCA.sqlcode
- 主变量(共享变量)
- 主语言通过主变量向SQL语句提供参数,主变量是由主语言的程序定义的,并用SQL的DECLARE语句说明。
- 在引用共享变量时,前面需要加“:”冒号
定义
EXEC SQL BEGIN DECLARE SECTION;
char Msname[4], Msex[3], givensno[5];
int Mage;
char SQLSTATE[6]; //特殊的共享变量,解释SQL语句的执行状况
EXEC SQL END DECLARE SECTION
共享
EXEC SQL INSERT INTO SC(Sno,Cno,Grade)
Values (:HSno, :HCno, :Hgrade);
游标
SQL语言是面向集合的,一条SQL语句可以产生或处理多条记录。而主语言是面向记录的,一组主变量一次只能放一条记录,所以,引入游标,通过移动游标指针来决定获取哪一条记录。
定义
它只是一条说明性语句,定义游标后,其中的SELECT语句并不执行
exec sql declare <游标名称> cursor for
<select 语句>
打开、推进、关闭游标
- 打开游标使得其处于活跃状态,游标是一个指针,此时指向查询结果的第一行之前。
- 推进游标,游标推进一行,并把游标指向的行(称为当前行)中的值取出,送到共享变量中
- 关闭游标,使它不再和查询结果相联系。游标关闭后,后面还可以再打开。
exec sql open <游标名称>
exec sql fetch <cursor_name> into 变量表
exec sql close <cursor_name>
存储过程
- 是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行
- 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值
- 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快
create procedure 存储过程名 (in | out | in out 参数 数据类型)
[as]
begin
<SQL语句>
end
- IN:为默认值,表示该参数为输入型参数,在过程体中值一般不变。
- OUT:表示该参数为输出参数,可以作为存储过程的输出结果,供外部调用者使用。
- IN OUT: 既可作为输入参数,也可作为输出参数。