ch9-服务器环境下的SQL_第1页
ch9-服务器环境下的SQL_第2页
ch9-服务器环境下的SQL_第3页
ch9-服务器环境下的SQL_第4页
ch9-服务器环境下的SQL_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本章讨论的问题1在独立运用SQL言语进展数据库操作时,这种运用方法被称为交互式SQL,交互式SQL的缺陷是只能进展数据库的操作,不能进展数据处置。当一个程序既要访问数据库又要处置数据时,把SQL言语嵌入到程序设计言语即宿主言语中,将SQL言语访问数据库的功能和宿主言语的数据处置功能结合起来是目前常用的方法,以这种方式运用的SQL被称为嵌入式SQL。.本章讨论的问题2本章主要讨论的就是如何把SQL运用到一个完好的编程环境中。由于宿主言语编译程序不能识别SQL言语,如何将嵌有SQL言语的宿主言语程序编译成可执行代码?宿主言语和DBMS之间如何传送数据?数据库的查询结果普通是一些元组的集合,这些元组

2、必需赋值给宿主言语变量才干被宿主言语运用。如何将元组赋给宿主言语的变量?DBMS和宿主言语的数据类型不完全对应,如何在两者之间进展必要而且合理的数据类型的转换?.SQL的三种编程方式嵌入到宿主言语(常规程序设计言语,如C)中关键问题:SQL与环境变量/宿主言语之间如何交换数据存储过程将SQL和被称为耐久性存储模块的普统统用程序结合起来,这些模块是以数据库方式方式存储的代码段,由用户以命令的方式执行调用级界面以常规言语编程,用函数库来访问数据库,例如为了从C程序中调用,可以运用称为SQL/CLI的SQL规范库,Java的JDBC,或PHP等.主要内容9.1 编程环境下的SQL9.2 方式中的存储

3、过程9.3 SQL 环境9.4 运用调用层接口9.5 SQL中的平安机制和用户认证.包含SQL语句的典型编程系统将包含宿主言语+嵌套SQL语句的程序提交给预处置器。预处置器将嵌套SQL语句转化为调用函数,此函数把SQL语句当作字符串参数,并且执行这个SQL语句 经过预处置的宿主言语程序随后以通常的方式编译.DBMS销售商提供了必要的函数库,这样实现SQL的函数被执行,并且整个程序像一个整体一样运作。还有另一种方式:程序员用宿主言语编写程序,在涉及到数据库访问时直接运用这些函数调用。这就是SQL编程的第3种方式“调用级界面/CLI.SQL与宿主言语之间的阻抗不匹配问题SQL与编程言语的数据类型差

4、别非常大SQL:关系数据模型,不运用指针、构造体、循环和分支常规编程言语:整型、实型、字符型、指针、记录、数组无法直接表示集合因此,在SQL和常规编程言语之间不能直接转移数据SQL与常规编程言语二者缺一不可SQL在很大程度上协助程序员编写数据库操作而很多重要任务(如算法实现)又离不开常规编程言语必需设计一种机制(例如提供接口),允许程序的开发既可以运用SQL,也可以运用常规编程言语(宿主言语).SQL/宿主言语接口数据库只能由SQL语句访问,在SQL和宿主言语之间经过宿主言语变量来传送信息,可以用SQL语句读或写宿主言语变量;数据库和宿主言语程序之间实现信息交换的变量称为共享变量SQL中对共享

5、变量的援用要加上冒号作为前缀在宿主言语中这些变量并不需求冒号.共享变量的声明 EXEC SQL BEGIN DECLARE SECTION; 共享变量的声明 EXEC SQL END DECLARE SECTION;共享变量的声明要放在DECLARE节中,声明节中的变量声明方式可以是宿主言语要求的任何方式。为使声明的变量有意义,共享变量类型必需是宿主言语和SQL都可以处置的如整型、实型和字符型,或者数组类型声明节.例如9.3EXEC SQL BEGIN DECLARE SECTION; char studioName50,studioAddr256; char SQLSTATE6;EXEC S

6、QL END DECLARE SECTION;.运用共享变量后面是嵌套的SQL语句共享变量在SQL中须加冒号作前缀.特殊变量SQLSTATE在SQL规范中,SQLSTATE这个特殊的变量由系统定义,用于衔接宿主言语程序与SQL执行系统。SQLSTATE是五个字符的数组类型。每次调用SQL的库函数,向SQLSTATE变量中存放一个代码,该代码表示调用过程中出现的问题。宿主言语程序可以读出SQLSTATE的值并且基于该值做出判别。.SQLSTATE变量的值SQL规范同时指定了大量的五个字符的代码和它们的意义。例如:00000: 没有产生任何错误02000:没找到作为SQL查询结果组成部分的元组。这

7、个代码非常重要:它允许在宿主言语程序中创建一个循环并且每执行一次循环检查一个元组,当关系中最后一个元组被检查后中止该循环。21000:表示单元组选择前往了多个元组.关键字EXEC SQL在宿主言语中运用SQL语句时,经过SQL语句前面的关键字EXEC SQL提示预处置器将有SQL代码进入。系统将预处置这些语句,用宿主言语中适宜的函数调用来替代这些语句,并充分利用与SQL相关的函数库。.SQL语句的嵌入任何不前往结果的SQL语句(即非查询语句)都可以用EXEC SQL为前缀直接嵌入到宿主言语中包括INSERT、DELETE和UPDATE语句以及那些创建、修正或者删除表和视图等方式元素的语句。然而

8、由于“阻抗不匹配,select-from-where查询不能直接嵌套到宿主言语。查询产生的结果是元组包,但是大多数宿主言语均不直接支持集合或包数据类型。.查询嵌入宿主言语的机制为了将查询结果与宿主言语程序相衔接,嵌套SQL有两种机制可选择:(1) 单元组选择语句:只需一个结果元组的查询可将该元组存储到共享变量中,一个变量对应元组的一个分量。(2) 游标:当查询结果是多个元组,可以为查询声明一个游标,游标范围覆盖结果关系中的一切元组,每个元组依次被提取到共享变量中,并由宿主言语进展处置。.(1) 单元组选择语句单元组选择的方式类似于交互式SQL中的select-from-where语句,只是SE

9、LECT子句后紧跟着关键字INTO和一连串的共享变量(以冒号作为前缀)。假设查询结果是个单一元组,那么这个元组的分量将分配给这些变量并成为它们的值。假设结果没有元组或者多于一个元组,那么不会分配给这些共享变量,同时一个相应的错误码被写入到SQLSTATE变量中。.单元组选择例如.(2) 游标 游标声明 EXEC SQL DECLARE CURSOR FOR 其中查询可以是通常的select-from-where查询或者关系名。游标范围覆盖该查询产生的关系元组。 翻开游标 (初始化) EXEC SQL OPEN 初始化游标的位置,使游标指向其所覆盖的关系中的第一个元组之前。.(2) 游标(续1)

10、 fetch子句 EXEC SQL FETCH FROM INTO 将游标向前推进一个位置,然后按照游标的当前位置取一个元组,对共享变量进展赋值。每个关系元组的属性对应列表里的一个变量。假设有一个可获取的元组,那么该元组相应的分量将赋值给对应的变量。假设元组曾经被遍历过了,那么不会前往任何元组,且SQLSTATE被赋值为02000,表示“没有发现任何元组。.(2) 游标(续2) 封锁游标 EXEC SQL CLOSE 游标将不再覆盖关系的元组。然而,游标可由另外一条OPEN语句重新初始化,它将重新覆盖这个关系的元组。.游标例如P266例7.4 分别计算净资产位数从1-14的出品人个数.游标更新

11、当游标遍历一个根本表的元组时,不仅可以读和处置每个元组的值,也可以修正或者删除当前元组。这里的UPDATE和DELETE语句,要求其WHERE子句只能是WHERE CURRENT OF,其后跟着游标的称号。.P267例7.5 更新行政长官的资产值,假设净资产值少于1000那么删除该元组,否那么将其净资产值加倍。MovieExecs (name, address, cert#, netWorth)游标更新例如.防止并发更新不希望游标读取的元组被并发的变化所影响对游标所读取关系进展修正的语句,在游标读取元组前就已彻底完成或在游标读取元组后再运转为了保证这一点,对于并发变化可以将游标声明为对并发修正

12、不敏感(insensitive)。例如: EXEC SQL DECLARE execCursor INSENSITIVE CURSOR FOR SELECT netWorth FROM MovieExec ;保证在execCursor翻开和封锁之间,对关系MovieExec所作的变化不会影响游标提取到的元组集合。.将游标声明为READ ONLY假设知关系R上的一个游标不会改动R,那么该游标可与R的其他不敏感游标同时运转。将游标声明为FOR READ ONLY,那么数据库系统可以保证根本关系R不会由于读取游标而修正了关系R。 EXEC SQL DECLARE execCursor CURSOR

13、FOR SELECT netWorth FROM MovieExec FOR READ ONLY;这样,任何试图经过游标execCursor所做出的关系修正都会产生错误。.卷型游标SCROLL游标同时提供了遍历关系中元组的顺序选择缺省选择是从关系顶端开场,依次提取元组直至末尾(最常用)。也可以经过定义卷型游标按别的顺序提取元组。为了可以按其他顺序提取元组,有2个步骤:声明游标时,将关键字SCROLL置于保管字CURSOR之前。通知SQL系统,游标的运用方式不只是按照元组顺序向前挪动。 FETCH语句中,关键字FETCH后面的选项决议所期望的元组的位置。.FETCH选项NEXT|PRIOR: 按

14、顺序提取相对于游标当前位置的下一个|上一个元组。NEXT为默许值。FIRST|LAST: 提取第一个|最后一个元组RELATIVE n: n为正|负整数。相对游标当前位置向前(n为正整数)|向后(n为负整数)挪动n个元组。 RELATIVE 1即NEXT, RELATIVE -1即PRIORABSOLUTE n: n为正|负整数。从头部(n为正整数)|尾部(n为负整数)挪动n个元组。 ABSOLUTE 1即FIRST , ABSOLUTE -1即LAST.卷型游标例如EXEC SQL DECLARE execCursor SCROLL CURSOR FOR MovieExec;EXEC SQL

15、 OPEN execCursor;EXEC SQL FETCH LAST FROM execCursor INTO :execName, :execAddr, :certNo, :worth;While(1) EXEC SQL FETCH PRIOR FROM execCursor INTO :execName, :execAddr, :certNo, :worth;.动态SQL 嵌入式SQL有两种主要的方式:静态的SQL和动态的SQL。静态的SQL语句是在编写程序时要定义一切的SQL语句,如INSERT、SELECT等普通的SQL语句。但很多情况下,SQL语句或SQL所带的参数在编译时并不知

16、道,运用必需在运转时才干生成SQL语句,这种在运转时才干生成的SQL语句叫动态SQL语句。对于动态SQL,SQL语句可以被运用程序在运转时构造。.假设在预编译时以下信息不能确认,就必需运用动态SQL技术: 1SQL语句正文 2主变量个数 3主变量的数据类型 4SQL语句中援用的数据对象例如,列、根本表、视图等 动态SQL方法允许在程序运转过程中暂时“组装SQL语句,主要有三种方式:1语句可变:允许用户在程序运转时暂时输入完好的SQL语句。2条件可变:对于查询语句,SELECT子句是确认的,即语句的输出是确定的,其他子句如Where子句、Having短语有一定的可变性。3数据库对象,查询条件均可

17、变:对于查询语句,Select子句的列名、From子句中的表名或视图名、Where子句和Having短语中的条件均可由用户暂时构造,即语句的输入和输出能够都是不确定的。.与之相关的动态定义语句简要引见如下:PREPARE语句:将一字符串解释成一组SQL语句,并赋给它一个语句标识符,以后的动态管理语句经过语句标识来援用这组SQL语句。PREPARE语句的普通方式为: PREPARE 语句标识名 from “SQL语句 或 PREPARE 语句标识名 from :宿主变量;EXECUTE语句:运转与其语句标识符对应的事先预备好的语句,对非select语句,用EXECUTE来运转。 EXECUTE语

18、句的普通方式为: EXECUTE 被预备的语句标识名using宿主变量列3. EXECUTE IMMEDIATE语句:立刻执行语句,它接纳一字符串,将其解释成SQL语句并立刻执行它,然后释放预备SQL语句所占用的资源。.4. DECLARE语句:为已预备好的select语句阐明游标。5. FREE语句:释放已预备好的语句或已翻开的游标所占用的资源6. DESCRIBE语句:确定已预备好的语句能否为select语句,假设是,那么得到单一查找行的存储要求,否那么只前往语句类型。.动态SQL的特性为:语句的阐明与执行分为两步。第一步,PREPARE语句用于分析SQL语句,并且在必要时建立一个程序方案

19、;第二步,用EXECUTE或定义游标来执行被预备好的SQL语句。这样一旦一条SQL语句经过预备处置后,就可反复执行它多次。参与仅执行一次的SQL语句那就不用做预备处置。.动态SQL执行的两个步骤1. 读入字符串并转换成可执行的SQL语句 EXEC SQL PREPARE V FROM V是SQL变量,是其值为字符串的恣意一条宿主言语表达式。宿主言语程序指点SQL系统接受刚读到的字符串,经语法分析后将其转化为可执行SQL语句, 用V表示2. 执行该SQL语句 EXEC SQL EXECUTE V执行V所代表的SQL语句。.上述两个步骤也可以合二为一 EXEC SQL EXECUTE IMMEDI

20、ATE 假设一条语句被编译一次,然后执行很多次时,就会看到合并这两步是不利的。运用EXECUTE IMMEDIATE ,每次语句执行时都要付出预备该语句的代价,而不是只付出一次。.动态SQL例如既然查询只执行一次,那么6)7)可替代为:EXEC SQL EXECUTE IMMEDIATE:query.本节习题机械三 P233 清华版 P271 9.3.1 (a) (d) 7.1.1 (a) (d) (f)(f) 使一切“旧PC的价风格低$100。要确保在他的程序运转期间插入的任何“新PC的价钱不会调低。7.1.3 请运用滚动游标找出如下关系中满足条件的一切PC。PC (model, speed

21、, ram, hd, cd, price)条件是:至少有两种速度一样而价钱更贵的PC。提示:读取先按速度再按价钱排序的PC的元组,对于每个读出的元组,往前跳两个元组看看速度能否没变。.主要内容9.1 编程环境下的SQL9.2 方式中的存储过程9.3 SQL 环境9.4 运用调用层接口9.5 SQL中的平安机制和用户认证.耐久性存储模块Persistent Stored Modules: SQL/PSM(简写为PSM)第二种结合SQL与通用程序设计言语的编程方法,允许用简单通用的言语编写过程并且将它们存储在数据库中,作为方式的一部分,称为PSM。这些过程可以在数据库中完成不能用SQL单独完成的处

22、置。 每个商用性的DBMS均向用户提供了本身的PSM扩展,本书中引见的是SQL/PSM规范,描画了这些扩展功能的主要思想。.PSM模块PSM中定义了模块 (modules),该模块是如下内容的集合:函数和过程定义暂时关系声明其他可选声明.1. 创建PSM函数和过程PSM过程的声明创建过程的保管字CREATE PROCEDUREPSM过程的参数是方式前缀-参数名-参数类型三元组方式前缀为IN|OUT|INOUT。这三个关键字分别阐明参数是仅输入的|仅输出的|既可输入又可输出的。缺省前缀是IN,可省略。CREATE PROCEDURE () 可选的部分变量声明 定义过程的可执行的代码体.创建PSM

23、函数和过程PSM函数的声明函数定义与过程定义的不同之处 运用保管字FUNCTION; 必需指定前往值的类型 RETURN; 函数的参数只可以是IN方式。换句话说,PSM阻止了函数中的副作用,从函数中得到信息的独一方式是经过函数的前往值。 在过程定义中常指出IN方式,但函数参数中不指明CREATE FUNCTION () RETURNS .存储过程例如存储过程中SQL语句的限制:只允许查询进展单元组选择语句和基于游标的访问。PSM过程将新旧两个地址作为其参数,并且用新地址交换MovieStar中每一个旧地址。变量类型与MovieStar方式定义中address的类型相匹配参数名可作常量,PSM过

24、程和函数中的参数或别的部分变量不要求加冒号.2. PSM中的简单语句格式调用语句前往语句部分变量声明赋值语句语句组语句标号.(1) 过程调用的语句 CALL ()调用语句在不同的地方运用不同的方式:宿主言语中的调用方式:EXEC SQL CALL Foo( :x, 3);作为另一个PSM函数或过程的语句作为发送给根本SQL界面的SQL命令例如:把语句CALL Foo(1,3);发送给该界面,并分别用 1和3作为赋值过程的两个参数,然后执行存储过程Foo在PSM中调用函数应运用函数名和匹配的参数作为表达式的一部分。.(2) 前往语句 RETURN ;该语句只能出如今函数中。它计算表达式的值,并将

25、函数的前往值设置为该计算结果。和普通编程言语不同的是:PSM的前往语句不终了这个函数。甚至,它将继续控制后面的语句,而且在函数完成之前前往值都能够会改动。.(3) 部分变量声明 DECLARE ;用给定的类型声明给定称号的变量。这个变量是部分的,在函数或者过程运转后,DBMS不再保管其值。函数或过程体中的部分变量声明必需在可执行语句之前.(4) 赋值语句 SET =;除了引导保管字SET外,PSM中的赋值和别的言语完全类似。计算等号右边表达式的值,将其赋值给左边的变量。表达式可以是NULL,甚至可以是查询,只需该查询是前往一个单值。.(5) 语句组语句组以分号终了,并置于保管字BEGIN和EN

26、D之间。这种构造被当作单个语句,可以出如今任何单个语句可以出现的地方。特别是,由于过程或函数体相当于单个语句,所以在过程和函数体中可插入任何语句序列,只需它们被置于BEGIN和END之间。.(6) 语句标号语句标号:用名字(标号名)和冒号作为前缀来标识语句。.3. 分支语句(IF语句)其方式与C和其他类似言语的不同是:用保管字END IF终了嵌套在IF语句中的ELSE子句以单词ELSEIF开场可选任何布尔类型的表达式语句列表由以分号终了的语句构成,但不用置于BEGINEND之间.课本例如编写一个关于年份y和电影公司s的函数,它前往一个布尔值,其值为TRUE当且仅当电影公司s在第y年至少制造了一

27、部喜剧电影,或其该年没有制造任何电影.4. PSM中的select-from-where查询方式(1)子查询可用于条件语句中,或者普通而言,在SQL中任何地方运用子查询都是合法的。.4. PSM中的select-from-where查询方式(2)前往单一值的查询可用在赋值语句的右边。(3)PSM中单元组选择语句是合法语句。INTO子句将变量赋值为单个前往元组的分量。这些变量可以是部分变量或PSM过程的参数。SET presNetWorth=(SELECT netWorth FROM Studio,MovieExec WHERE presC#=cert# AND S=studioName);.4

28、. PSM中的select-from-where查询方式(4)声明和运用游标。下面几点是不同的:语句中不出现EXEC SQL部分变量不运用冒号前缀运用游标的例子将被延迟到下一节学习了PSM循环语句之后.5. PSM中的LOOP循环 LOOP END LOOP;假设对LOOP语句设置循环标识,可运用下面的语句中断循环: LEAVE ;循环中可用游标读取元组,当没有更多元组时,就希望分开这个循环。对于表示没有找到元组的SQLSTATE值( 02000),可以定义一个条件名: DECLARE Not_Found CONDITION FOR SQLSTATE 02000;更普通地,可以用如下语句声明表

29、示任何希望与SQLSTATE值相对应的标识作为条件: DECLARE CONDITION FOR SQLSTATE ;.PSM循环例如本例的PSM过程将电影公司称号s作为输入参数,并且用输出参数mean和variance给出电影公司s拥有的一切电影长度的平均值和方差。 均值的定义: 方差的定义: 方差计算公式: .6.PSM中的FOR循环PSM中的FOR循环构造,独一重要的目的是游标的迭代。.FOR循环例如.PSM中的其他循环 PSM中也有while和repeat循环,其含义与C一样。也就是说,可以创建如下方式的循环 WHILEDO END WHILE;或者这种方式的循环: REPEAT UN

30、TIL END REPEAT;.7. PSM中的异常处置SQL系统经过在SQLSTATE变量中设置非零数字序列来阐明错误条件。例如:02000表示“没有找到元组 21000表示单元组选择前往了多个元组PSM可以声明称为异常处置的代码。即在语句或语句组执行过程中,当错误代码列表中的任何一个出如今SQLSTATE中时,就调用异常处置。.异常处置的组成每一个异常处置都和一个由BEGINEND描画的代码块有关。处置过程出如今代码块中,并且仅仅针对代码块中的语句。异常处置的组成一组异常条件:当这些条件成立时调用异常处置当异常发生时,与该异常相关联的执行代码指明处置器完成处置后的转移去处。.异常处置声明的

31、方式DECLARE HANDLER FOR 转移方式有3种选择:CONTINUE:表示执行异常处置声明中的语句之后,继续执行产生异常的语句之后的语句。EXIT:表示执行异常处置语句后,控制分开声明异常处置的BEGINEND块,下一步执行该代码块之后的语句。UNDO:与EXIT差不多,区别在于到目前为止,已执行的该块语句对数据库或部分变量产生的变化都被吊销由逗号分隔的条件列表,可以是被声明的条件,也可以是SQLSTATE和5位字符串的表达式。.异常例如编写一个PSM函数,以电影片名作为参数,前往电影的年份。假设该片名的电影不存在或是不止一个的 话,那么前往NULL。.8. 运用PSM函数和过程在

32、嵌套的SQL程序、PSM代码本身或提供应根本界面的普通SQL命令中都可调用PSM函数和过程用保管字CALL作为前缀来调用过程函数作为表达式的一部分出现.运用PSM函数和过程的例如假定方式中包括了具有GetYear函数的模块。想象面对根本界面,预备输入Denzel Washington是Remember the Titans中的影星这个现实。但却忘记了电影年份。只需这个称号的电影只需一部,并且它在关系Movies中,那么就不用经过预先查询去找出该年份。而且,可以将下面的语句插入到根本SQL界面中:.P241 习题9.4.1 在电影数据库上用PSM过程或函数完成以下义务: Movies (titl

33、e, year, length, genre, studioName, producerC#) StarsIn (movieTitle, movieYear, starName) MovieStar (name, address, gender, birthdate) MovieExecs (name, address, cert#, netWorth) Studio (name, address, presC#)a)给定电影公司的称号,计算其制片经理的净产值。c)给定电影公司称号,将该电影公司的两部最长的电影片名作为参数输出。假设没有这样的电影那么参数中的一个或两个被赋值为NULL(例如,假

34、设电影公司只需一部电影,那么没有“第二长的电影)。d)给定一个影星的名字,找出由他出演的时间超越120分钟的最早的电影。假设没有这样的电影,那么前往年份0 .主要内容9.1 编程环境下的SQL9.2 方式中的存储过程9.3 SQL 环境9.4 运用调用层接口9.5 SQL中的平安机制和用户认证.什么是SQL环境SQL环境是SQL中数据所在的框架,该框架下可以存储数据、并对数据进展SQL操作,可以看做安装并运转在某些系统上的DBMS。数据库的一切元素,包括表、视图、触发器等,都是在SQL环境中定义的。这些元素组成了层次性构造:方式目录簇.1. 方式指“数据库方式而非“关系方式,是组织的根本单元。

35、方式是表、视图、断言、触发器等数据库元素的集合。方式声明的方式:CREATE SCHEMA 方式声明例如7.19.1. 方式(续)CREATE SCHEMA 提供了在SQL语句中创建表、视图以及授予对象权限的方法;不同方式的方式元素可以重名,可用“方式名.方式元素名来援用某个方式元素。没有必要一次就声明完一切的方式。可以运用适宜的CREATE、DROP或ALTER语句来修正或添加方式运用SET SCHEMA语句改动“当前的方式。 例如: SET SCHEMA MovieSchema ; 将使例7.19描画的方式作为当前方式.2. 目录方式的集合,方式的创建和修正都在目录中。每个目录有一个或多个

36、方式,目录中的方式名必需独一,每个目录包含一个叫IMFORMATION_SCHEMA的特殊方式,这个方式包含了该目录中一切方式的信息。设置当前目录的语句: SET CATALOG ;对方式的操作(新建/修正方式等)都是针对当前目录.数据库方式元素的全名 . . 例如:目录MovieCatalog中的方式MovieSchema的表Movies的援用如下:MovieCatalog . MovieSchema . Movies假设目录是缺省的或是当前的目录,那么可省去目录名假设方式也是缺省的或当前的方式,那么方式部分也可以省去,这样只留下元素本人的称号。然而,当需求访问当前方式或目录以外的元素时,就

37、不得不运用完全名。.3. 簇簇是目录的集合。每个用户有一个关联的簇,是用户可访问的一切目录的集合。簇是被提交的查询的最大范围,故在一定程度上,簇是特定用户所看到的“数据库。.SQL环境中的客户和效力器按照SQL规范,SQL环境有两种特殊的进程:SQL 效力器:支持对数据库元素的操作,充任数据库效力器的角色。SQL客户程序:允许用户衔接到效力器上,对数据库进展操作。 例如:效力器运转在一个大的存储数据库的主机上,而客户程序运转在其他主机上,也许是远离效力器的个人任务站,也许是和效力器运转在同一台主机上。SQL的客户程序和效力器通常与衔接、会话和模块这三个概念严密地联络在一同。.衔接衔接是指将客户

38、端和效力器衔接起来。假设在SQL客户端主机上运转包含SQL的程序,那么可经过CONNECT语句翻开客户端和效力器间的衔接: CONNECT TO AS AUTHORIZATION 依赖于安装。可用称号DEFAULT将用户衔接到任何被作为“缺省效力器安装的SQL效力器。AUTHORIZATION授权子句后跟随着用户名和密码,提供应效力器进展验证。可在以后用于援用衔接。缘由是SQL允许用户翻开好几个衔接,但任何时候只需一个衔接有效。.援用衔接任何当前有效的衔接进入休眠形状后,只需用SET CONNECTION语句显式地调用才干将其激活; SET CONNECTION conn1;运用DISCONN

39、ECT语句断开衔接时conn1被中止不是休眠,不能再被激活: DISCONNECT conn1; 注:假设衔接创建后再也不被援用,CONNECT TO子句中的AS和衔接名可以省略。.会话当衔接激活时,所执行的SQL操作将在客户端和效力器之间构成恳求-呼应式的交互,我们称这样的操作序列为一个会话Session。会话和创建它的衔接处于同一形状,例如:当衔接处于休眠形状时,它的会话也处于休眠形状SET CONNECTION语句可激活衔接,同时激活相应会话。每个会话有一个当前目录和该目录中的一个当前方式由语句SET SCHEMA和SET CATALOG进展设置每个会话都有一个授权用户.模块SQL操作代

40、码SQL2规范建议SQL实现至少为用户提供如下三种类型的运用程序称为模块之一:通用SQL接口:这种类型就是交互式SQL,在这种方式下用户可以输入由SQL效力器执行的SQL语句,每个查询或其他操作都是独立的模块。嵌入式SQL:在这种方式下,SQL语句出如今宿主言语程序中,并有EXEC SQL引导。经过预处置程序把嵌入式SQL言语转换为适于SQL系统的函数调用,编译好的宿主言语程序执行到相应的函数语句时将调用相应的函数。实践模块:含有存储函数或过程集合的模块。这些函数|过程部分是宿主言语代码,部分是SQL语句,它们之间可经过参数或共享变量进展通讯。.SQL客户端-效力器交互模块的执行被称为SQL代

41、理;模块是代码,SQL代理是代码的执行;模块和SQL代理作为一个整体,经过访问SQL客户端建立与数据库的衔接。.三层体系构造图.三层体系构造(1) Web效力器:可以解析HTTP协议。当Web效力器接纳到一个HTTP恳求,会前往一个HTTP呼应,例如送回一个HTML页面。(2) 运用效力器:经过各种协议(可以包括HTTP),提供访问商业逻辑的途径,供客户端运用程序运用(3) 数据库效力器:运转DBMS并执行运用效力器恳求的查询和更新.三层体系构造的解释假设他访问的网页只需象HTML这种页面的,用WEB效力器就够了但是假设是JSP,也就是含JAVA代码的HTML,那么就需求JAVA运用效力器了,

42、由于只需JAVA运用效力器才干解析JSP里的JAVA代码,并将解析结果以HTML的格式前往。.主要内容9.1 编程环境下的SQL9.2 方式中的存储过程9.3 SQL 环境9.4 运用调用层接口9.5 SQL中的平安机制和用户认证.授权ID本节首先学习SQL允许对数据库元素进展哪些授权、然后学惯用户如何获得授权( 即授权ID) 、最后如何授权;SQL假定存在授权ID,这些ID根本上都是用户名 SQL有一个特殊的授权ID,称作PUBLIC,它包含了一切用户。授权ID可以被授予权限.1. 权限SQL中定义了九种类型的权限:SELECT、INSERT、DELETE、UPDATE:运用于关系的查询、插

43、入、删除、更新的权益;REFERENCE:在完好性约束下援用关系的权益。约束可以是第7章引见的断言、基于属性或元组的检查、或援用完好性约束等;USAGE:主要运用在关系和断言之外的其他方式元素上,给出了在声明中运用域等其他方式元素的权益TRIGGER:定义这个关系上的触发器的权益EXECUTE:执行如PSM过程|函数之类代码的权益UNDER:创建给定类型的子类型的权益.权限例如思索以下插入语句所需的权限拥有关系Studio的INSERT或INSERT (name)权限拥有关系Movie的SELECT或SELECT (studioName)权限拥有关系Studio的SELECT或SELECT (

44、name)权限其他属性分量上只能接受缺省值或NULL.2. 创建权限获得权限有两个方面需求明确创建权限:权限最初是如何创建的授权:权限如何从一个用户传送到另一个用户.SQL元素(如方式或模块)都有一个属主。属主拥有其所属事物的一切权限。创建权限的关键在于如何获得属主身份。在SQL中建立属主身份有三种情况:方式创建时,该方式及其一切方式元素的一切权都属于其创建者。该用户拥有方式元素一切能够权限会话被CONNECT语句初始化时,可用AUTHORIZATION子句指定用户。模块SQL操作代码创建时,可经过AUTHORIZATION子句选择其属主例如:CONNECT TO Starfleet-sql-

45、server AS conn1 AUTHORIZATION kirk;用户kirk创建了一个衔接到名为Starfleet-sql-server的SQL效力器的链路conn1 。在SQL的实现中还将验证用户名能否有效,例如经过讯问密码。也可将密码包含在AUTHORIZATION子句中,但这种方式密码可见。 模块创建语句中的子句AUTHORIZATION picard;使得用户picard成为该模块的属主。 模块也可以不指定属主,这种情况下模块被公开执行,执行模块中的任何操作所必需的权限必需从别处获得,例如:在模块执行过程中衔接和会话与用户的关联。2. 创建权限.3. 检查权限的过程每个模块、方式

46、和会话有一个相关用户(即授权ID)任何SQL操作有两部分:操作执行涉及的数据库元素产生操作的代理对代理有效的权限来自当前授权ID,这个ID可以是:模块授权ID:假设代理正在执行的模块有一个授权ID会话授权ID只需当前授权ID拥有执行操作所涉及的数据库元素所必需的权限,就可以执行这个SQL操作。.例如关系表Movies和Studio是用户Janeway创建和拥有的方式MovieSchema的一部分。用户Janeway拥有这些表和方式MovieSchema的任何其他元素的一切权限。该插入例如可以有如下几种执行方式:.插入例如执行方式1用户Janeway创建了一个包含AUTHORIZATION Ja

47、neway子句的模块,这个插入作为该模块的一部分来执行,那么Janeway是模块授权ID。假设有模块授权ID,该ID总是变成当前授权ID,于是Janeway成为当前授权ID。那么该模块及其SQL插入语句拥有与用户Janeway一样的权限,包括表Movies和Studio的一切权限。.插入例如执行方式2插入是模块的一部分,但是该模块没有属主;用户Janeway在CONNECT语句中用AUTHORIZATION Janeway子句翻开一个衔接(会话授权ID) 。于是 Janeway再次成为当前授权ID,该插入拥有了所需的一切权限。.插入例如执行方式3用户Janeway将表Movies和Studio

48、一切权限授权给用户archer,或是代表“一切用户的特殊用户PUBLIC假定插入语句存在于带有AUTHORIZATION archer子句的模块中,模块授权ID是archer ,因此当前授权ID是archer。而且archer拥有所需的权限,故插入再次被允许。.插入例如执行方式4假定用户Janeway曾经将所需的权限给了用户archer。同时又假定插入语句存在于没有属主的模块中,模块在一个会话中执行,该会话的授权ID由AUTHORIZATION archer子句设置。会话授权ID是archer。这样当前授权ID是archer且这个ID拥有所需的权限。 .四条准那么拥有数据的用户,其ID就是当前

49、授权ID,那么所需权限总是可用的。执行方法(1)和(2) 假设用户的ID是当前授权ID,而且数据的属主曾经把所需求的权限授予了该用户或授予给用户PUBLIC,那么这些权限也是可用的。执行方法(3)和(4)执行数据的拥有者所拥有的模块或者执行对数据已有授权的某个用户所拥有的模块,就使得所需求的权限是可用的。执行方法(1)和(3)在会话它的授权ID是具有所需求权限的用户期间执行公用模块是合法执行该操作的另一种方法。执行方法(2)和(4).4. 授权SQL提供了GRANT语句,以允许一个用户将权限授权给另一个用户。第一个用户仍保管所授予的权限。授权选项WITH GRANT OPTION假设用户A将带

50、有授权选项的某个权限授权给用户B,那么用户B可以把该权限再次授权给别的用户(带授权选项或不带);假设用户A 授予用户B某个权限时不带授权选项,那么用户B无法再将该权限授予别的用户只需A 可以把该权限授予别的用户.授权语句的语法格式GRANT ON TO WITH GRANT OPTION 典型的是一个关系(根本表或视图)。假设是其他类型的元素,元素名之前应有作前缀,如ASSERTION。是一个或多个权限,如INSERT (name )或 SELECT。关键字ALL PRIVILEGES可根据需求在此出现,表示授权者对正在讨论的数据库元素可合法授予的一切权限。.授权语句的执行为了合法地执行这条授

51、权语句,执行它的用户必需拥有被授予的权限,而且这些权限还必需带有授权选项。但授权者可以拥有比授出的权限更通用的权限(带有授权选项)。例如,表Studio的INSERT(name)权限被授出,同时授权者拥有表Studio的更通用的带有授权选项的权限INSERT。.授权例如用户Janeway是MovieSchema方式的属主,该方式包括 Movies (title, year, length, genre, studioName, producerC#) Studio (name, address, presC#)(1) Janeway将表Studio的INSERT和SELECT权限以及表Movi

52、es的SELECT权限授予用户kirk和picard。而且包括了这些权限的授权选项。 GRANT SELECT,INSERT ON Studio TO kirk, picard WITH GRANT OPTION; GRANT SELECT ON Movies TO kirk, picard WITH GRANT OPTION;.授权例如(续)(2) Picard授予用户sisko一样的权限,但没有授权选项 GRANT SELECT,INSERT ON Studio TO Sisko; GRANT SELECT ON Movies TO Sisko;(3) Kirk也授予Sisko 表Stud

53、io的SELECT和INSERT (name) 权限以及Movies的SELECT权限 GRANT SELECT,INSERT (name) ON Studio TO Sisko; GRANT SELECT ON Movies TO Sisko;.5. 授权图用授权图表示授权。SQL系统维护授权图的表示,并跟踪权限及其起始点(以防权限被收回)。授权图的节点对应一个用户和一个权限。留意:执行语句带或不带授权选项是不同的权限,必需用两个不同的节点表示(即使属于同一用户也如此)假设某用户的一个权限比另一个权限更通用(如R上的SELECT与在R(A)上的SELECT),也要用两个不同的节点表示。假设用户U将权限P授予用户V,该授权是基于U拥有权限Q ,于是从节点U/Q到节点V/P可以画一条弧 Q可以是带授权选项的P,或是P带有授权选项的泛化.授权图商定节点的“用户名权限后,用一个*表示该权限带有授权选项节点的“用户名权限后,用*阐明了该权限来自正在讨论的数据库元素的一切权(而不是由别处授予的权限) 并自动包括了授权选项。 .授权图例如 GRANT SELECT,INSERT ON Studio TO kirk, picard WITH GRANT OPTION;JanawaySELECT on Movie*JanawayINSERT on Studio*JanawayINSERT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论