考前的一些复习整理,虽然考试考的会很浅,但难得有机会认真的复习一下数据库内容……
游标 cursor
DECLARE cursor_name CURSOR FOR SELECT ...
OPEN cursor_name
FETCH FROM cursor_name INTO @v_1,@v_2...
WHILE @@FETCH_STATUS=0
失败返回-1
没有找到记录返回100
CLOSE cursor_name
DEALLOCATE cursor_name
存储过程
CREATE PROCEDURE proc_name
@input ='default',@input...
AS
SELECT ...
RETURN @output ...
DECLARE @in INT ...
EXECUTE @in = proc_name '','',...
EXECUTE @in = proc_name @input = '',...
如果是OUTPUT参数的话调用PROC时需要传入数据对象
DECLARE @in INT, @avg INT
EXECUTE @in = proc_name @input = ' ',@avg = @avg OUTPUT
返回游标
CREATE PROCDURE proc_name
@cursor_out CURSOR OUTPUT
AS
SET @cursor_out = CURSOR FOR
sql_statement
OPEN cursor_out
触发器
CREATE TRIGGER trigger_name ON
table_name
FOR/INSTEAD OF
INSERT/UPDATE/DELETE
sql_statement
动态SQL
DECLARE cursor_name DYNAMIC CURSOR FOR SQLSA
PREPARE SQLSA FROM @sql_statement --通常为字符串变量
OPEN DYNAMIC cursor_name USING @parameter
数据库安全
访问控制
存取控制
用户角色权限
自主存取控制
强制存取控制
每一个数据对象被标以密级,每个用户被许可相应的级别
建立登录用户
CREATE LOGIN zhang WITH PASSWORD = '....' {[ MUST_CHANGE ]
[,DEFAULT_DATABASE = database ]
[, CHECK_EXPIRATION = { ON | OFF}]}
尽管指定了默认数据库,但是在成为该数据库用户前还是无法USE该数据库。
修改用户
ALTER LOGIN zhang DISABLE/ENABLE
ALTER LOGIN zhang WITH PASSWORD='bistu'
ALTER LOGIN zhang WITH PASSWORD='mis' OLD_PASSWORD='bistu'
删除登录用户
DROP LOGIN login_name
数据库用户
CREATE USER user_name [LOGIN login_name]
[ WITH DEFAULT_SCHEMA = schema_name ]
默认架构即访问数据库对象时可以省略架构名
USE 仓储订货
CREATE USER zhang WITH DEFAULT_SCHEMA =仓储
没有指定login则自动映射到同名login
在创建前USE数据库,指定默认架构,此时zhang成为了数据库用户,但在没有得到操作授权前不能进行查询和操作。
游标 cursor
DECLARE cursor_name CURSOR FOR SELECT ...
OPEN cursor_name
FETCH FROM cursor_name INTO @v_1,@v_2...
WHILE @@FETCH_STATUS=0
--失败返回-1
--没有找到记录返回100
CLOSE cursor_name
DEALLOCATE cursor_name
存储过程
CREATE PROCEDURE proc_name
@input ='default',@input...
AS
SELECT ...
RETURN @output ...
DECLARE @in INT ...
EXECUTE @in = proc_name '','',...
EXECUTE @in = proc_name @input = '',...
如果是OUTPUT参数的话调用PROC时需要传入数据对象
DECLARE @in INT, @avg INT
EXECUTE @in = proc_name @input = ' ',@avg = @avg OUTPUT
返回游标
CREATE PROCDURE proc_name
@cursor_out CURSOR OUTPUT
AS
SET @cursor_out = CURSOR FOR
sql_statement
OPEN cursor_out
触发器
CREATE TRIGGER trigger_name ON
table_name
FOR/INSTEAD OF
INSERT/UPDATE/DELETE
sql_statement
动态SQL
DECLARE cursor_name DYNAMIC CURSOR FOR SQLSA
PREPARE SQLSA FROM @sql_statement --通常为字符串变量
OPEN DYNAMIC cursor_name USING @parameter
数据库安全
访问控制
数据加密
存取控制
用户角色权限
自主存取控制
强制存取控制
每一个数据对象被标以密级,每个用户被许可相应的级别
建立登录用户
CREATE LOGIN zhang WITH PASSWORD = '....' {[ MUST_CHANGE ]
[,DEFAULT_DATABASE = database ]
[, CHECK_EXPIRATION = { ON | OFF}]}
尽管指定了默认数据库,但是在成为该数据库用户前还是无法USE该数据库。
修改用户
ALTER LOGIN zhang DISABLE/ENABLE
修改口令
ALTER LOGIN zhang WITH PASSWORD='bistu'
ALTER LOGIN zhang WITH PASSWORD='mis' OLD_PASSWORD='bistu'
删除登录用户
DROP LOGIN login_name
数据库用户
CREATE USER user_name [LOGIN login_name]
[ WITH DEFAULT_SCHEMA = schema_name ]
默认架构即访问数据库对象时可以省略架构名
USE 仓储订货
CREATE USER zhang WITH DEFAULT_SCHEMA =仓储
没有指定login则自动映射到同名login
在创建前USE数据库,指定默认架构,此时zhang成为了数据库用户,但在没有得到操作授权前不能进行查询和操作。
数据库用户分类
public角色
创建角色
CREATE ROLE role_name [ AUTHORIZATION owner_name ]
以sa登录后直接执行如下命令:
USE 仓储订货
CREATE ROLE manager
指定角色
sp_addrolemember @rolename='manager',@membername='huang'
或
sp_addrolemember 'manager','huang'
取消角色
sp_droprolemember @rolename='manager',@membername='huang'
修改角色名称命令
ALTER ROLE role_name WITH NAME = new_name
例:将角色manager的名称修改为orders_manager 。
ALTER ROLE manager WITH NAME = orders_manager
授予权限-对象权限
GRANT SELECT ON 基础.职工(职工号,仓库号,姓名,班组长) TO public
GRANT INSERT,UPDATE(经手人,供货方,订购日期,金额),DELETE
ON 订货.订购单 TO order_man
WITH GRANT OPTION
GRANT ... ON A.B TO ... AS ...
REVOKE GRANT OPTION FOR INSERT ON table FROM role
REVOKE INSERT ON table FROM role
架构权限
GRANT INSERT/CONTROL ON SCHEMEA::name TO user
ALTER AUTHORIZATION ON SCHEMEA::name/table_name TO user/SCHEMA OWNER
ALTER schema_to TRANSFER schema_from.table
语句权限
CREATE TABLE/RULE
BACKUP 等
禁止权限
DENY X TO A
事务
在关系数据库中,一个事务可以是一条SQL语句,一个SQL语句序列或整个程序。
事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务则由DBMS按缺省规定自动划分事务(隐式事务)。
在SQL语言中,定义事务的语句有:
BEGIN TRANSACTION 定义事务开始
COMMIT 提交事务
ROLLBACK 回滚事务
事务的特性
以上称为事务的ACID特性。
可能导致事务ACID特性被破坏的因素
数据恢复机制和并发控制机制的任务
设置隐含事务方式的命令
SET IMPLICIT_TRANSACTIONS ON
取消隐含事务方式的命令
SET IMPLICIT_TRANSACTIONS OFF
基本的封锁类型
排它锁(Exclusive Locks,简称X锁),又称为写锁;
若事务T对数据对象A加X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。
这保证了其他事务在T释放A的锁之前不能再读取和修改A。
共享锁(Share Locks,简称S锁),又称为读锁。
若事务T对数据对象A加S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A的S锁。
这就保证了其他事务可以读A,但在T释放A的S锁之前不能对A做任何修改。
SQL Server的封锁操作是在相关语句的“WITH (
TABLOCK:对表施行共享封锁,在读完数据后立刻释放封锁,此类封锁可以避免读“脏”数据,但不具有可重复读的特性。
HOLDLOCK:与TABLOCK一起使用,可将共享锁保留到事务完成,而不是在读完数据后立即释放锁,这样可以保证数据的可重复读。
NOLOCK:不进行封锁,此关键词仅应用于SELECT语句,这样可能会读取未提交事务的数据,即有可能发生“脏”读。
TABLOCKX:对表实施独占封锁。
UPDLOCK:对表中的指定元组实施更新封锁;这时其它事务可以对同一表中的其它元组也实施更新封锁,但是不允许对表实施共享封锁和独占封锁。
建立冗余数据最常用的技术是数据转储和登录日志文件。