SQLServer复习笔记:数据库编程、数据库安全、事务管理与并

2019-06-24  本文已影响0人  魔娃

考前的一些复习整理,虽然考试考的会很浅,但难得有机会认真的复习一下数据库内容……

游标 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

删除登录用户

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

修改口令

删除登录用户
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

基本的封锁类型

SQL Server的封锁操作是在相关语句的“WITH (<table_hint>)”子句中完成的,该短语可以在SELECT、INSERT、UPDATE和DELETE等语句中指定表级锁定的方式和范围。

TABLOCK:对表施行共享封锁,在读完数据后立刻释放封锁,此类封锁可以避免读“脏”数据,但不具有可重复读的特性。
HOLDLOCK:与TABLOCK一起使用,可将共享锁保留到事务完成,而不是在读完数据后立即释放锁,这样可以保证数据的可重复读。
NOLOCK:不进行封锁,此关键词仅应用于SELECT语句,这样可能会读取未提交事务的数据,即有可能发生“脏”读。
TABLOCKX:对表实施独占封锁。
UPDLOCK:对表中的指定元组实施更新封锁;这时其它事务可以对同一表中的其它元组也实施更新封锁,但是不允许对表实施共享封锁和独占封锁。

建立冗余数据最常用的技术是数据转储和登录日志文件。

上一篇 下一篇

猜你喜欢

热点阅读