您好、欢迎来到现金彩票网!
当前位置:彩运网 > 封锁粒度 >

第五章 数据库安全保护ppt

发布时间:2019-06-16 03:44 来源:未知 编辑:admin

  1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

  法一:把相关数据库的.mdf格式文件和.ldf格式文件拷贝下来: 拷贝数据库 附加数据库: 附加数据库: 法二:备份数据库 法二:备份数据库 拿到bak文件的人,在自己的SSMS中新建一个空数据库,和bak这个名字相同 法三:生成数据库脚本 法三:生成数据库脚本 法三:生成数据库脚本 会生成一个.sql文件 最后交给我的: 解决方案:使用信号量Sem,以及P、V原语实现互斥: Sem初始值 = 1,(若Sem 0, 表示等待使用临界区的事务有Sem个); 任何一个事务想进入临界区,必须先做P原语; 任何一个事务做完了离开临界区之前,必须先做V原语; P( Sem ) { Sem = Sem – 1; if ( Sem = 0) {事务继续执行;} else {将事务阻塞放入等待队列;} } P原语: V( Sem ) { Sem = Sem + 1; if ( Sem 0) {事务继续执行;} else {从等待队列中取出第一个事务放入 就绪队列;} } V原语: 例子:假设事务Pa、Pb互斥访问临界区:Sem初始为1 Pa: P( Sem ); …a… V( Sem ); Pb: P( Sem ); …b… V( Sem ); 起初Pa首先抢占临界区:P( Sem ) ? Sem = 0 ? ….a…. Pb访问临界区: P( Sem ) ? Sem = -1 ? Pb进入等待队列 Pa继续执行: V( Sem ) ? Sem = 0 ? 从等待队列中取出Pb Pb: ….b…. Pb: V( Sem ) ? Sem = 1 ? 继续执行Pb (在Pb执行过程中没有其他进程来访问临界区) DBMS提供的锁,主要有以下三种: 排它锁(X锁); 共享锁(S锁); 意向锁(IS锁、IX锁、ISX锁); 共享锁(S锁):一旦挂上S锁,则: 允许其他事务读取同一种数据,但不能修改该数据,(即,同一个门上可以挂多把S锁); 不允许修改该数据的事务访问数据; 当读取数据的事务读完数据之后,立即释放所占用的资源; *,一般地,当使用SELECT 语句访问数据时,系统自动对所访问的数据挂上S锁; 排他锁(X锁):一旦某个数据被挂上X锁,则: 其他事务都不能在该数据上再挂X锁; 其他事务也不能在该数据上放S锁。即,不允许可以产生共享锁的事务访问这些资源; 只有当产生X锁的事务结束之后,该数据才能被其他事务使用; *,对于那些修改数据的事务,例如,使用INSERT、UPDATE、DELETE语句,系统自动在所修改的事务上放置排他锁; 意向锁(I锁): 如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁; 对任一结点加锁时,必须先对它的上层结点加意向锁; 例如:对任一元组加锁时,必须先对它所在的关系加意向锁; 于是,事务T要对关系R1加 X锁时,系统只要检查根结点数据库和关系R1是否己加了不相容的锁,而不再需要搜索和检查尺中的每一个元组是否加了X锁; 意向锁(I锁): 意向排他锁(IX锁):对一个数据对象加 IX锁,表示它的后裔结点拟(意向)加 X锁。例如,要对某个元组加 X锁,则要首先对关系和数据库加 IX锁; 意向共享锁(IS锁):对一个数据对象加IS锁,表示它的后裔结点拟(意向)加 S锁。例如,要对某个元组加 S锁,则要首先对关系和数据库加 IS锁; 意向共享排他锁(SIX锁):对一个数据对象加 SIX锁,表示对它加 S锁,再加IX锁,即 ISX=S+IX。例如对某个表加 ISX锁,则表示该事务要读整个表(所以要对该表加 S锁),同时会更新个别元组(所以要对该表加 IX锁); 之前提到的一个加锁会带来的问题(活锁): 5.4 死锁问题 While( 1 ) { if ( key[S] = = 1) { key[S] = 0; ……….. key[S] = 1; } } 进程Pa: While( 1 ) { if ( key[S] = = 1) { key[S] = 0; ……….. key[S] = 1; } } 进程Pb: 另一种问题---死锁: T1 T2 ① LOCK R ? ② ………... ? ③ LOCK P ? ④ WAIT…. ⑤ WAIT…. ⑥ WAIT…. ? ? LOCK P ? ?……… ? ?……… LOCK R WAIT…. 另一种问题---死锁: 例如:事务1和事务2都获取了对某一资源的共享锁,在对该资源进行读操作。然后事务1和事务2都要修改数据,即都需要将共享锁转换为排它锁。因为排它锁与共享锁不兼容,所以转换的时候必须要等待。然后每个事务都等待另一个事务释放共享锁,因此发生死锁; 若要避免这种潜在的死锁问题,请使用更新锁(U锁)。一次只有一个事务可以获得资源的更新锁。如果事务修改资源,则更新锁转换为排他锁。 产生死锁的4个必要条件: 互斥:并发事务所要求的是临界资源; 不可剥夺:其他事务不能强行剥夺,只能等其自己释放; 部分分配:动态分配,请求新资源同时不释放已有资源; 环路条件:参与死锁的事务形成一种循环链; 以上条件只要一个不成立,死锁就自动解除; 产生死锁的4个必要条件: 互斥:并发事务所要求的是临界资源; 不可剥夺:其他事务不能强行剥夺,只能等其自己释放; 部分分配:动态分配,请求新资源同时不释放已有资源; 环路条件:参与死锁的事务形成一种循环链; 以上条件只要一个不成立,死锁就自动解除; 死锁的排除方法: 死锁预防:使产生死锁的4个条件中只要有一个不成立,死锁就会立刻解除; 破坏“互斥条件”:使之共享临界资源 破坏“部分分配”条件:一次分配所有资源,若得不到满足,就释放相应资源;(缺点:静态分配很难做到、浪费资源、降低事务并发性、降低进程执行效率) 破坏“环路条件”:给系统中所有的资源编号,事务在申请资源时必须严格按照资源编号的递增次序进行,否则系统不予分配(降低并发性、编号会增大系统开销) 死锁的检测和恢复:定期启动一个软件检测系统的状态,若发现有死锁存在,则采取措施恢复之,(判断依据:超时。。。); 封锁的粒度:封锁对象的大小; 粒度越大,并发度越小;粒度越小,并发度越高,但开销也越高; 多粒度封锁; 资源 描述 RID 行标识符,用于单独锁定表中的某一行 键 索引中的行锁 页 8KB的数据页或索引页 扩展盘区 相邻的8个数据页或索引页构成的一组 表 包括所有数据和索引在内的整个表 DB 整个数据库 SQL Server2005中对并发的一般处理方式: 先规定隔离级别: 再可根据实际情况,给对象设手工锁: holdlock、nolock、paglock、rowlock、tablock、tablockx。。。。。。。 隔离级别 污读 不可重复读 幻象 Read uncommitted YES YES YES Read committed NO YES YES Repeatable read NO NO YES serializable NO NO NO Read uncommitted:相当于该事务内的所有句子上都设置nolock; Read committed:该事务在读数据时,别的事务可以修改数据,或者插入数据; Repeatable read:该事务在读数据时,别的事务不可修改数据,但可插入数据; Serializable:该事务对数据进行操作时,别的事务啥事都不能做; 隔离级别 污读 不可重复读 幻象 Read uncommitted YES YES YES Read committed NO YES YES Repeatable read NO NO YES serializable NO NO NO 例子: CREATE PROCEDURE MODI_M AS DECLARE @i int; DECLARE @sl int; SELECT @i = 1 SET TRANSACTION ISOLATION LEVEL SERILIZABLE WHILE (@i = 8000) BEGIN BEGIN TRAN SELECT @sl = 数量 FROM sales WITH(tablockx) WHERE 客户代号=‘A0001’ WAITFOR DELAY ‘00:00:00.001’ UPDATE sales SET 数量=@sl-1 WHERE 客户代号=‘A0001’ COMMIT TRAN; SELECT @i=@i+1 END ODBC: 是一个由数据库应用程序访问的调用函数库; 应用程序通过这些函数可以操作数据库中的数据; ODBC中的函数可分为六类,分别实现:内存的分配与释放、建立连接、执行SQL语句、接受结果、事务控制、错误处理等; 访问数据库的一般步骤 图像分割 JDBC Java Database Connectivity,Java数据库连接。 提供了一种与平台无关的用于执行SQL的标准Java API,可以方便的实现多种数据库的统一操作(Java实现的数据库接口); 由一组用Java语言编写的类和接口组成,在java.sql包中,(基本功能与ODBC一样,只是把函数改成了类); 用JDBC进行各种数据库的连接与操作,向数据库中发送各种SQL命令; 各大DBMS若想让自己的数据库支持Java,则必须符合JDBC的标准; 图像分割 早期,为了访问某种数据库,必须了解这种数据库对外提供的API函数------跨数据库平台出现障碍; 图像分割 解决方案:统一各个数据库的接口 JDBC是Java提供的唯一一个用来访问各种数据库的统一的接口; 图像分割 针对不同的数据库,会采用不同的JDBC中的类库; 图像分割 JDBC 图像分割 图像分割 图像分割 步骤: 载入驱动程序: Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”); 实例化时自动向DriverManager注册,不需显式调用DriverManager.rigisterDriver方法; 建立连接: Connection con = DriverManager.getConnection( jdbc:sqlserver://127.0.0.1:1433,zhoudi,123); 指定当前数据库: con.setCatalog(testJDBC); 图像分割 JDBC: 用JAVA实现的数据库接口; 其基本功能与ODBC类似,只是将ODBC的函数调用改成类的调用; JAVA中的多线程机制可以通过JDBC同时连接多个数据库; JDBC是一种规范,各个数据库厂家各自实现自己的驱动程序(Driver) 一般步骤: STEP 1:载入驱动程序; STEP 2:以URL方式指定哪种类型的Driver,并对数据库建立连接; STEP 3:创建Statement对象,通过Statement对象向数据库发送各种SQL语句; executeUpdate( SQL ):执行会修改数据库内容的各种SQL操作; executeQuery( SQL ):执行SQL查询操作; 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e b precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 从栈中取出数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 从栈中取出数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 从栈中取出数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 从栈中取出数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 从栈中取出数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 从栈中取出数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: precedure myput (data) begin top ? top +1; (top) ? data; end precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 两段语句同时处理 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 两段语句同时处理 precedure myput (data) begin top ? top +1; (top) ? data; end 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end precedure myput (data) begin top ? top +1; (top) ? data; end 两段语句同时处理 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end precedure myput (data) begin top ? top +1; (top) ? data; end 两段语句同时处理 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end precedure myput (data) begin top ? top +1; (top) ? data; end 两段语句同时处理 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end precedure myput (data) begin top ? top +1; (top) ? data; end 两段语句同时处理 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end precedure myput (data) begin top ? top +1; (top) ? data; end 两段语句同时处理 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e b precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end precedure myput (data) begin top ? top +1; (top) ? data; end 两段语句同时处理 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e b precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end precedure myput (data) begin top ? top +1; (top) ? data; end 两段语句同时处理 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e b a precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end precedure myput (data) begin top ? top +1; (top) ? data; end 两段语句同时处理 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e b a precedure myput (data) begin top ? top +1; (top) ? data; end precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 两段语句同时处理 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e b a precedure myput (data) begin top ? top +1; (top) ? data; end precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 两段语句同时处理 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e b a precedure myput (data) begin top ? top +1; (top) ? data; end precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 两段语句同时处理 出现错误! 因为并发执行表现出“间断性”特征,而且经常需要共享系统资源,所以会导致执行过程中出现各种错误------对于并发操作必须加以控制;(保持数据库中数据的一致性,即在任何一个时刻数据库都将以相同的形式给用户提供数据) 事务(Transaction) :是数据库系统中执行的一个不可分割的工作单位,它是由用户定义的一组操作序列,这些操作要么全做,要么全不做,是恢复和并发控制的基本单位。 显式定义事务: 事务的提交 事务的回滚 BEGIN TRANSACTION SQL 语句1 SQL 语句2 。。。。。。 COMMIT BEGIN TRANSACTION SQL 语句1 SQL 语句2 。。。。。。 ROLLBACK 事务的特征: 原子性(Atomicity) 一个事务是一个不可分割的工作单位,事务执行时,要么不做,要么全做,即不允许完成部分的事务; 一致性(Consistency) 事务操作后,数据库中的数据要满足各种完整性约束; 隔离性(Isolation) 如果多个事务并发地执行,应像各个事务独立执行一样,一个事务的执行不能被其他事务干扰 持久性(Durability) 指一个事务一旦提交,它对数据库中数据的改变就应该是持久的,即使数据库因故障而受到破坏,DBMS也应该能够恢复 甲账户转账给乙账户的事务: BEGIN TRANSACTION Read(Money甲); Money甲 = Money甲 - amount; IF(Money甲 0) THEN { Print(“余额不足,不能转账”); ROLLBACK; } ELSE { Read(Money乙); Money乙 = Money乙 + amount; Write( Money乙 ); COMMIT; } 并发操作会产生的三种错误: 1. 丢失修改: 飞机订票系统中的一个活动序列: 1)甲售票员读出某航班的机票余额A,设A=16; 2)乙售票员读出同一航班的机票余额A,也为16; 3)甲售票点卖出一张机票,修改机票余额A←A-1, 所以A=15,把A写回数据库; 4)乙售票点也卖出一张机票,修改机票余额A←A-1, 所以A=15,把A写回数据库; 结果:卖出两张机票,但数据库中机票余额只减少1。 这种情况称为数据库的不一致性; 并发操作会产生的三种错误: 1. 丢失修改: T1 T2 ① 读A=16 ? ② ? ③ A←A-1 写回A=15 ? ④ ? ? 读A=16 ? ? ? ? A←A-1 写回A=15 事务1和事务2从数据库中读入同一数据并修改; 事务2的提交结果破坏了事务1提交的结果; 即导致事务1的修改被丢失 2. 不可重复读: 事务1读取数据之后,事务2执行更新操作; 从而使事务1无法再现前一次读取的结果; ? ? ? 读B=100 B←B*2 写回B=200 ? ① 读A=50 读B=100 求和=150 ② ? ? ③ 读A=50 读B=200 求和=250 (验算不对) T2 T1 2. 不可重复读: 事务1读取数据之后,事务2执行更新操作; 从而使事务1无法再现前一次读取的结果; ? ? ? 读B=100 B←B*2 写回B=200 ? ① 读A=50 读B=100 求和=150 ② ? ? ③ 读A=50 读B=200 求和=250 (验算不对) T2 T1 有三种“不可重复读”: 读---更新; 读---删除; 读---插入; 幻觉读 3. 读脏数据: 事务1修改某一数据,并将其写回磁盘; 事务2读取同一数据之后,事务1由于某种原因被撤销,此时事务1已修改过的数据恢复原值; 事务2独到的数据就与数据库中的数据不一致,是不正确的数据,又称“脏”数据; ?? ? ? 读C=200 ? ? ? ① 读C=100 C←C*2 写回C ② ? ? ③ ROLLBACK C恢复为100 T2 T1 实现数据库中并发控制的方法:封锁(Locking)、时标(Timestamp); 封锁技术,参考了操作系统中的“互斥加锁”: 任何一个事务离开临界区时,其他事务可以进入临界区; 某个不在临界区内的事务,不能阻止其他事务进入临界区; 若干个事务申请进入临界区,只有一个事务获批准; 一个事务申请进入临界区的等待时间应该是有限的; 封锁实现: 当某个事务进入临界区之后,它就将临界区锁上,直到它退出为止。 给临界区S设置一个锁定位key[S]: key[S] == 1,表示该临界区可以进入 Key[S] == 0,表示该临界区不可进入 If ( key[S] = = 1) { lock( key[S] ); ……….. unlock( key[S] ); } If ( key[S] = = 1) { key[S] = 0; ……….. key[S] = 1; } 封锁实现: 当某个事务进入临界区之后,它就将临界区锁上,直到它退出为止。 给临界区S设置一个锁定位key[S]: key[S] == 1,表示该临界区可以进入 Key[S] == 0,表示该临界区不可进入 加锁实现,存在一些缺陷: 需要不停地测试key[S],会消耗大量的CPU时间; 不公平现象; While( 1 ) { if ( key[S] = = 1) { key[S] = 0; ……….. key[S] = 1; } } 进程Pa: While( 1 ) { if ( key[S] = = 1) { key[S] = 0; ……….. key[S] = 1; } } 进程Pb: 安全性控制:尽可能杜绝所有的数据库非法访问; 审计:(选用) 审计追踪把用户对数据库的所有操作自动记录下来,存放在一个特殊文件中,即审计日志中。 记录的内容一般包括:操作类型(如修改、查询等),操作终端标识与操作者标识,操作日期和时间,操作所涉及到的相关数据(如基本表、视图、记录、属性等),数据的前象和后象等。 为了实现安全性,SQL Server2005对用户的访问进行两个阶段的检验: 身份验证:登陆服务器的登录名; 权限许可确认:已经登陆到服务器上的用户可执行的具体操作,包括对哪个数据库进行什么样的操作; 图像分割 SQL Server2005的安全性机制 SQL Server2005提供的身份验证模式: Windows身份验证模式: 使用windows操作系统中的账户名和密码进行登陆SQL Server2005服务器;(原因:Windows有很强的用户账户管理工具,可以设置账户锁定、密码期限等); 是默认的身份验证模式,其安全性比混合模式高; 混合身份验证模式: 用SQL Server登录名或者Windows账户进行登陆; 优点:支持除Windows客户之外的更大范围用户; 使用客户应用程序连接到SQL Server 身份验证模式? WINDOWS身份验证模式 混合模式 使用windows账户连接么? 使用SQL Server账户连接么? 连接许可? 是有效登录么? SQL Server接受连接 密码正确么? NO NO NO SQL Server拒绝连接 YES YES YES YES YES SQL Server拒绝连接 NO NO SQL Server2005登陆名管理: SQL Server2005登陆名管理: 登录名创建之后,用户只能通过该登录名访问整个SQL Server2005,单不能访问服务器中的某个数据库: SQL Server2005的数据库用户账号: SQL Server2005的数据库用户账号: 用户账号,要在特定的数据库内创建,并关联一个登陆账号。即当一个数据库的用户创建时,必须关联一个登陆账号; SQL Server2005的数据库用户账号: 给数据库用户账号赋一定的权限: 给数据库用户账号赋一定的权限: 给数据库用户账号赋一定的权限: 数据库的完整性:保护数据库中数据的正确性、有效性和相容性,防止错误的数据进入数据库造成无效操作; 安全性,防范对象是非法用户和非法操作; 完整性,防范对象时不合语义的数据; 图像分割 5.2 完整性控制 完整性规则主要由以下三部分组成: 触发条件:规定系统什么时候使用规则来检查数据; 约束条件:规定系统检查用户发出的操作请求违背了什么样的完整性约束条件; 违约响应:规定系统如果发现用户发出的操作请求违背了完整性约束条件,应该采取一定的动作来保证数据的完整性,即违约时要做的事情; 完整性规则,可分为: 立即执行约束:一条语句执行完毕后; 延迟执行约束:整个事务执行结束后; 一条完整性规则可以用一个五元组(D,O,A,C,P)来形式化地表示 : D(Data):约束作用的数据对象,可以是关系、元组和列三种对象; O(Operation):触发完整性检查的数据库操作,即当用户发出什么操作请求时需要检查该完整性规则,是立即执行还是延迟执行; A(Assertion):数据对象必须满足的语义约束,这是规则的主体; C(Condition):选择A作用的数据对象值的谓词; P(Procedure):违反完整性规则时触发执行的操作过程。 例如:对于“学号(SNO)不能为空”的这条完整性约束中,D、O、A、C、P的含义分别如下: D:代表约束作用的数据对象为SNO属性; O:当用户插入或修改数据时需要检查该完整性规则; A:SNO不能为空; C:A可作用于所有记录的SNO属性; P:拒绝执行用户请求。 完整性约束条件是完整性控制机制的核心。 关系模型的完整性包括: 实体完整性; 用户自定义完整性; 参照完整性; 例如:删除S表中的S1元组,则亦会自动删除SC表中与S1相关的元组; 违反之后的处理方式:拒绝执行 违反之后的处理方式:执行该操作以外,自动执行一些附加操作,以保证数据库状态仍为正确; 完整性约束的对象,可分为静态与动态两种: 静态约束:对数据库每一个确定状态所应满足的约束条件,是反映数据库状态合理性的约束,这是最重要的一类完整性约束。值的约束和结构的约束均属于静态约束; 动态约束:指数据库从一种状态转变为另一种状态时,新旧值之间所应满足的约束条件,动态约束反映的是数据库状态变迁的约束; 例如:学生年龄在更改时只能增长,职工工资在调整时不得低于其原来的工资 用户对于数据库的操作,往往涉及多种资源:有时需要CPU,有时需要存取数据,有时需要I/O或其他通信; 所以对于数据库,有两种方法可实现多用户操作: 串行; 并行; 并发:单CPU系统中,多个任务由同一个CPU交替切换执行,(其实是假的同时运行); 并行:多CPU系统中,每个CPU负责处理一个任务,(真的是在同时运行); 图像分割 5.3 并发控制与封锁 Vs. 并发操作,如果不加以一定的控制,则容易产生不正确的数据,导致数据库的不一致性或各种错误: 可以并发操作的条件:Bernstein 令: R(S): 对S数据块进行读操作 W(S): 对S数据块进行修改、写操作 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: precedure myput (data) begin top ? top +1; (top) ? data; end 往栈中存入数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: precedure myput (data) begin top ? top +1; (top) ? data; end top 往栈中存入数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: precedure myput (data) begin top ? top +1; (top) ? data; end top f 往栈中存入数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: precedure myput (data) begin top ? top +1; (top) ? data; end top f 往栈中存入数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: precedure myput (data) begin top ? top +1; (top) ? data; end top f e 往栈中存入数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: precedure myput (data) begin top ? top +1; (top) ? data; end top f e 往栈中存入数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: precedure myput (data) begin top ? top +1; (top) ? data; end top f e b 往栈中存入数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: precedure myput (data) begin top ? top +1; (top) ? data; end top f e b 往栈中存入数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: precedure myput (data) begin top ? top +1; (top) ? data; end top f e b a 往栈中存入数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e b a precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 从栈中取出数据: 满足Bernstein条件,则并发执行的语句能保持封闭性和可再现性;若不满足,则会引起烦。 栈S: top f e b precedure myget (top) begin r ? (top) ; top ? top -1; return ( r ); end 从栈中取出数据: 用SQL语言创建索引: 例如:为表SC,在SNO和CNO上建立唯一索引 CREATE UNIQUE INDEX SC_INDEX ON SC(SNO ASC, CNO) 默认情况为ASC。这种复合索引,先按SNO递增索引,对于相同的SNO,又按照CNO递增索引; CREATE [UNIQUE] [CLUSTERED NONCLUSTERED] INDEX index_name ON table_name (column_name [ ASC DESC ] [ ,...n ] ) 删除索引: 例如:将表SC上的索引SC_INDEX删除 DROP INDEX SC.SC_INDEX DROP INDEX 表名.索引名 存储过程(Stored Procedure):是在数据库服务器端执行的一组T-SQL语句集合,可以将一系列针对数据库的操作作为一个单元来进行处理。(有点类似于函数) 图像分割 存储过程 存储过程中,可以对任何数据及对象进行修改,包括:新建或删除表、修改数据库设置、或其他管理操作; 使用存储过程的优点: 执行速度快: 存储过程在创建时就经历了语法检查和性能优化,而且在第一次调用过后就驻留在内存中,不必再编译和优化; 模块化程序设计:在程序中可多次调用该存储过程; 减少网络通讯量: 存储过程中可包含大量的SQL语句,但是调用时只需要一条传送一条语句就可以实现; 保证系统安全性: 设置用户通过存储过程来对某些关键数据进行访问,而不许用户直接使用SQL语句对数据做访问; 存储过程的类别: 用户自定义存储过程: 用户自己编写的可重复使用的SQL语句功能模块,在数据库中有唯一的名称,可附带参数; 系统存储过程: SQL SERVER 2005提供,由前缀“sp_”标识。用来完成一些与系统相关系的复杂任务。用户存储过程与系统存储过程重名时,用户存储过程永远不会被调用; 扩展存储过程: 是以C语言等编写的外部程序,以动态链接库(Dll)形式存储在服务器上,SQL Server可以动态装载并执行它们 创建存储过程: Step 1: Step 2: “指定模版参数的值” Step 3: 把模版中的句子改成你要的句子,再 即可; 执行存储过程: EXEC 存储过程名 带参数的存储过程: SQL Server 2005提供了两种主要机制来强制执行业务规则和数据完整性:约束、触发器; 触发器(Trigger):一种特殊的存储过程,在插入(INSERT)、删除(DELETE)或修改(UPDATE)特定表中的数据时触发执行。不能被直接调用,也不能传参; 触发器用途:强制执行一定的业务规则,以保持数据完整性、检查数据有效性、实现数据库管理任务和一些附加的功能; 图像分割 触发器 使用触发器的优点: 触发器是自动执行的; 对表中数据进行修改等操作后,触发器立即被激活; 可以调用存储过程; 为了实现复杂操作,触发器可以调用一个或多个存储过程; 可以强化数据条件约束; CHECK约束不允许引用其他表中的列来完成检查工作,而触发器可以引用其他表中的列; 触发器可以禁止或回滚违反完整性约束的各种更改; 触发器是基于一个表创建的,但是可以针对多个表进行操作; 创建触发器: STEP 1: STEP 2: STEP 3: 回滚的例子: 禁用触发器: 数据库安全保护 第五章 问题的提出: 数据库的一大特点是共享,所以必然带来安全性问题; 数据库中的数据共享,并不是无条件共享; 数据库中的数据,只能是在DBMS统一严格控制之下进行共享,只允许有合法访问权限的用户访问授权给他的那部分数据; 数据库的安全保护措施,是衡量DBMS性能的主要标准之一; 图像分割 5.1 数据库的安全性 安全性:防止因非法使用数据库造成数据泄露、更改或破坏; 非法使用数据库的情况: 用户编写一段合法的程序绕过DBMS及其授权机制,通过OS直接存取、修改或备份数据库中的数据; 第三方应用程序执行非法非授权操作; 通过多次合法查询数据库从中推导出一些保密数据; 例:某数据库应用系统禁止查询单个人的工资,但允许查任意一组人的平均工资。 用户甲想了解张三的工资 安全性:防止因非法使用数据库造成数据泄露、更改或破坏; 非法使用数据库的情况:(可能是有意的、无意的、恶意的) 用户编写一段合法的程序绕过DBMS及其授权机制,通过OS直接存取、修改或备份数据库中的数据; 第三方应用程序执行非法非授权操作; 通过多次合法查询数据库从中推导出一些保密数据; 例:某数据库应用系统禁止查询单个人的工资,但允许查任意一组人的平均工资。 用户甲想了解张三的工资,于是他:首先查询包括张三在内的一组人的平均工资, 然后查用自己替换张三后这组人的平均工资,从而推导出张三的工资 安全性控制:尽可能杜绝所有的数据库非法访问; 由系统提供一定的方式让用户标识自己的名字或身份,系统内部记录着所有合法用户的标识,每次用户要求进入系统时,由系统进行核实,通过鉴定后才提供机器的使用权 安全性控制:尽可能杜绝所有的数据库非法访问; 数据对象 操作类型 模式 模式 建立、修改、检索 外模式 建立、修改、检索 内模式 建立、修改、检索 数据 表 查找、插入、修改、删除 属性列 查找、插入、修改、删除 用户标识 数据对象 操作类型 安全性控制:尽可能杜绝所有的数据库非法访问; 安全性控制:尽可能杜绝所有的数据库非法访问; 对于授权表,衡量授权机制的重要指标:授权颗粒度; 关系数据库中,授权颗粒度包括:关系、记录、属性; 授权颗粒度越细,能提供的安全性就越完善; 安全性控制:尽可能杜绝所有的数据库非法访问; 视图机制: 通过视图机制把要保护的数据对无权存取这些数据的用户隐藏起来,从而自动对数据提供一定程度的安全保护; 实际应用中经常是视图机制和授权机制配合使用; 例:王平只能检索计算机系学生的信息 STEP 1:先建立计算机系学生的视图CS_Student STEP 2:在视图上进一步定义存取权限 CREATE VIEW CS_Student AS SELECT * FROM Student WHERE Sdept=‘CS’ GRANT SELECT ON CS_Student TO 王平 安全性控制:尽可能杜绝所有的数据库非法访问; 操作系统必须保证不能绕过DBMS来访问数据库; 安全性控制:尽可能杜绝所有的数据库非法访问; 数据加密:一般简单的,替换或者顺序重排 明文:M, 密文:C 加密函数:E, 解密函数:D, 密钥:K 加密过程:EK(M)=C 解密过程:DK(C)=M 开发版,安装: Step 1: SQL Server有些功能要依赖IIS,所以先配置IIS; 安装SQL SERVER 2005 如果不安装IIS,在装SQL SERVER时会出现以下错误: Step 2: 安装SQL Server; Step 2: 安装SQL Server; Step 2: 安装SQL Server; 如果此处,只有最后一个复选框可选,其他都为灰色不可选,那说明你的版本有问题 以下都选“默认” 这个界面是登陆到刚刚安装的数据库,因为安装的时候使用的是“默认实例”,也就是计算机名称,“IceWee-PC”是我的计算机名称,点击连接就登陆到数据库了 索引:一类特殊的数据库对象,保存了数据表中一列或几列组合的排列顺序; 作用:极大提高数据检索效率; 图像分割 索引 SELECT * FROM YG_GZB WHERE YG_ID=1109 索引的种类: 聚集索引(Clustered Index) 聚集索引中,索引的顺序与表中数据行物理顺序相同; 聚集索引由上下两层构成: 上层:索引页,包含表中的索引页面,用于检索; 下层:数据页,包含实际的数据页面; 对表中某一列建立聚集索引时,表中的数据会按照索引顺序重新排列,并对表进行修改; 对YG_ID建立聚集索引之前: 对YG_ID建立聚集索引之后: 关于聚集索引的几个注意事项: 一个表只能有一个聚集索引; 聚集索引最适合于范围搜索,因为相邻的行会被物理的存放在相邻的页面上; 因为聚集索引会改变表的物理顺序,所以应该先建立聚集索引,后建立非聚集索引; 主键,是聚集索引的良好候选者; 非聚集索引(Nonclustered Index) 索引的顺序与表中数据行物理顺序一般不相同,所以索引有序,而表中的数据可以无序。即,表中的数据不是按照索引顺序排列的; 一个表中可以含有多个非聚集索引,最高可达249个; 非聚集索引,通过索引上的指针与数据表进行关联; 使用索引的意义: 可以极大加快WHERE中数据检索的速度; 在使用ORDER BY和GROUP BY子句进行数据检索时,可以显著减少排序和分组的时间; 创建唯一索引,可以帮助保证数据记录的唯一性; 使用索引可以再检索数据的过程中使用优化隐藏器,提高系统性能; 可以加速表与表之间的连接; 一般,假如某字段是A表的主键,又是B表的外键,那么就在A表中对该字段设为索引; 使用索引的代价: 创建索引要花费时间和占用存储空间; 时间上:建立聚集索引时,数据被复制以便建立聚集索引,索引建立后,再将旧的未加索引的表数据删除; 空间上:创建索引需要占用存储空间,例如创建聚集索引需要占用的存储空间是数据库表占用空间的1.2倍; 使用索引的代价: 建立索引加快了数据检索速度,但是却减慢了数据修改的速度; 每执行一次数据的插入、删除或更新操作时,都要修改和维护相应的索引。 即,对建立了索引的表执行各类修改操作要比未建立索引的表执行修改操作花费更多的时间; 建立索引的原则: 考虑用来建索引的列,有如下这些: 主键: 因为通常检索、存取等操作是通过主键来完成的; 经常要用于表间连接的列: 用于连接的列若按顺序存放,系统可以很快地执行连接; 聚集索引要建立在非聚集索引之前,否则倒过来会导致非聚集索引的重排; 建立索引的原则: 不考虑用来建索引的列,有如下这些: 经常要发生变更的列; 很少甚至从来不在查询中引用到的列; 只有两个或很少几个值的列(例如“性别”); 以bit、text、image数据类型定义的列; 行数很少的小表格,一般没必要创建索引; 几个容易存在的误区: 主键不一定是聚集索引。只是SQL SERVER默认会在主键上建聚集索引。ORACLE中就默认是非聚集的。 聚集索引也没有非要是唯一索引。也只是SQL SERVER给人带来的错误映像。 主键VS唯一索引: 一张表只能有一个主键,但是可以有多个唯一索引。 主键不可以为NULL,唯一索引可以有NULL。 SQL Server 2005中创建索引:

http://funnyland.net/fengsuolidu/424.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有