三、数据库后台编程技术

1.设在SQL Server 2008中有如下定义触发器的语句:

CREATE TRIGGER tri ON T1 INSTEAD 0F INSERT AS .下列关于该触发器执行机制的说法,正确的是_

A.当在T1表上执行INSERT操作时,只执行tri触发器, 而不实际执行INSERT操作

B. 当在T1表上执行INSERT操作时,先执行tri 触发器,然后再实际执行INSERT操作

C. 当在T1表上执行INSERT操作时,先执行INSERT操作, 然后再执行tri触发器

D. 当在T1表上执行INSERT操作时,先执行INSERT操作,如果操作正确,则无需执行tri触发器

答案: A

使用FOR或者AFTER选项定义的触发器为后触发型触发器,即只有在引发触发器执行的语句中的操作都已成功执行,并且所有的约束检查也成功完成后,才执行该触发器。

使用INSTEAD 0F选项定义的触发器为前触发型触发器,在这种模式的触发器中,指定执行触发器而不是执行引发触发器执行的SQL语句,从而替代触发的操作。

因此,可知本题中属于前触发器,即只执行tri触发器,而不实际执行INSERT操作 。故答案为A。

2.下列关于SQL Server 2008游标中@FETCH STATUS的说法, 正确的是____ 。

A. 用户可以在游标中声明@@FETCH STATUS变量

B. 每个游标都有一个专属于自己的@FETCH STATUS变量

C. 每当对游标执行一次FETCH语句,系统都会自动对@@ETCH STATUS赋一次值

D. 用户可以对@@FETCH STATUS变量进行赋值

答案: C

在对游标数据进行提取的过程中,可以使用@@FETCH STATUS全局变量判断数据提取的状态。由于@FETCH STATUS对于在一个连接上的所有游标是全局性的,不管是对哪个游标,只要执行一次FETCH语句, 系统都会对@@FETCH STATUS赋一 次值,以表明该FETCH语句的执行情况。故答案为C。

3.下列关于SQL Server 2008 中前触发器的说法,正确的是_____ 。

A. 在一个表上只能定义一个前触发器

B. 在前触发器执行之后,再执行引发触发器执行的数据操作语句

C. 定义前触发器使用的选项是FOR

D. 在一个表上针对同一个数据操作只能定义一个前触发器

答案: D

使用INSTEAD OF 选项定义的触发器为前触发器。在这种模式的触发器中,指定执行触发器而不是执行引发触发器执行的SQL语句,从而替代触发的操作。

在一个表上可以建立多个名称不同、类型各异的触发器,每个触发器可由所有三个操作来引发。对于前触发器,在一 个表上针对同一个数据操作只能定义一个前触发器;对于后触发器,可以在同一种操作上建立多个触发器。故答案为D。

4.下列关于SQL Server 2008游标中FETCH语句的说法,正确的是_

A. FETCH NEXT表示先将游标当前行指针移动到下一行,并提取所指向的行数据

B. FETCH NEXT表示先提取游标当前行指针所指向的行数据,然后将游标当前行指针下移一行

C. 用FETCH语句只能将游标当前行指针向下移动

D. 用FETCH语句不能提取指定行数据

答案: A

NEXT关键字的作用是返回紧跟在当前行之后的数据行,并且当前行递增为结果行。PRIOR关键字返回紧临当前行前面的数据行,并且当前行递减为结果行。

ABSOLUTE n和RELATIVE n关键字用于指定特定行。FIRST关键字返回游标中的第一行并将其作为 当前行。LAST关键字返回游标中的最后-行并将其作为当前行。 故答案为A。

5.下列关于存储过程的说法,错误的是____。

A. 存储过程是调用执行的、存储在服务器端的代码段。

B. 利用存储过程可以提高数据操作性能

C. 存储过程可以接受多个输入参数,但只能有一个输出参数

D. 利用存储过程可以提升数据的安全性

答案: C

存储过程可以接受多个输入参数,也可以接受多个输出参数。故答案为C。

6.设在SOL Server 2008中有如下定义存储过程的语句:

CREATE PROC p1

@x int, @y int = 10,@z int output

……

下列关于调用该存储过程的语句,错误的是_

A.

DECLARE @i int output

EXEC p1 10, @i

B.

DECLARE @i int

EXEC p1 10, 100, @i output

C.

DECLARE @i int

EXEC p1 10,defau1t, @i output

D.

DECLARE @i int

EXECp1@x=10,@z=@ioutput

答案: A

在调用存储过程时,只需要声明参数的类型,不能指明参数为输出参数。只有再执行时才能指明参数为输出参数。故答案为A。

7.下列关于存储过程的说法,正确的是____。

A. 存储过程不支持输入参数有默认值

B. 一个存储过程只能有一个输出参数

C. 存储过程的返回结果可以是一个集合

D. 删除存储过程的语句是:

DELETE PROCEDURE存储过程名



答案: C

在创建存储过程中可以声明一个或多个参数。除非定义了参数的默认值或者将参数设置为等于另一个参数,否则用户在调用存储过程时必须为每个声明的参数提供值。一个存储过程最多可以有2100个参数。一个存储过程可以有多个输出参数。

删除存储过程的语句为:

DROP { PROC | PROCEDURE } { [schema. name. ] procedure}[, ..n]故答案为C。

8.设在SQL Server 2008中有如 下定义存储过程的语句:

CREATE PROC p1

@x char(10), @y int, @z int

调用该存储过程的语句,正确的是_

A.  EXEC p1 'abc', 100

B. EXEC p1 'abc', 200, 100

C.  EXEC p1’abc', default, 100

D. EXEC p1 @x=' abc', @z=100



答案: B

由定义存储过程的语句可知,声明了3个参数,分别为x、y和z。 在调用存储过程时,需要为每个声明的参数提供值。选项AD中缺少一个参数值,所以错误。

如果存储过程没有为参数指定默认值,而在执行存储过程时又使用了DEFAULT关键字,则会出现错误,所以选项C错误。故答案为B。

9.设在SOL Server 2008中有如下定义存储过程的语句:

CREATE PROC p1

@x char(10) =’abc’, @y int= 10, @z int = 100下列关于调用该存储过程的语句,错误的是____。

A. EXEC p1 'xxx’, @z = 10

B .EXEC p1

C. EXEC p1 'xx'

D. EXEC p1 xxx’, 20

答案: A

执行有多个输入参数的存储过程时,参数的传递方式有两种:

①按参数位置传递值

按参数位置传递值指执行存储过程的EXEC语句中的实参的排列顺序必须与定义存储过程时定义的参数的顺序-致。

②按参数名传递值按参数名传递值指的是执行存储过程的EXEC语句中要指明定义存储过程时指定的参数的名字以及此参数的值,而不关心参数的定义顺序。选项A中两种传递方式矛盾,故答案为A。

10.设在SOL Server中有如下定义触发器的语句,

      CREATE TRIGGER tri_1ON T1 FOR INSERT

下列关于该触发器作用的说法,正确的是___ 。

A. 在TI表定义了一个用于插入数据的后触发型触发器

B. 在T1表上定义了一个用于插入数据的前触发型触发器

C. 在TI表上定义了一个由插入操作引发的后触发型触发器

D. 在T1表 上定义了一个由插入操作引发的前触发型触发器



答案: C

for或after指的是后触发器,instead of是前触发器。insert指的是引发触发器执行的操作是插入操作,所以语句的功能是在T1表上定义了一个由插入操作引发的后触发型触发器。故答案为C。

11.下列关于SQL Server数据库空间的说法,正确的是_

A. 数据库创建后可以手工缩小数据文件和日志文件的空间

B. 数据库创建后可以手工缩小数据文件的空间,但不能缩小日志文件的空间

C. 数据库创建后数据文件和日志文件的空间都不能被手工缩小

D. 数据库创建后可以手工缩小日志文件的空间,但不能缩小数据文件的空间

答案: A

收缩数据库就是释放数据库中未使用的空间,并将释放的空间交还给操作系统。数据文件和日志文件的空间都可以收缩。

12.在SQL Server中,若要授予用户U在DB1数据库中具有创建视图的权限,下列授权语向正确的是____。

A.

GRANT CREATE VIEW TO U1

B.

GRANT CREATE VIEW 0N DB1 TO U1

C.

GRANT U1 CREATE VIEW ON DB1

D.

GRANT U1 CREATE VIEW



答案: A

对象级授权命令中,视图权限中没有create权限,所以这里是语句级授权。授予语句级别权限的GRANT语句的简化语法格式如下:

GRANT {ALL | [, ..].. TO

由语法可知,应选A,而不能选B (B选项是对象级授权命令)。

13.下列关于SQL Server中 db_ datawriter角色的说法,正确的是____。

A. 该角色是数据库级角色,具有查询、插入、删除和更改数据库中用户数据的权限

B. 该角色是服务器级角色,具有插入、删除和更改服务器中用户数据的权限

C. 该角色是服务器级角色,具有查询、插入、删除和更改服务器中用户数据的权限

D. 该角色是数据库级角色,具有插入、删除和更改数据库中用户数据的权限



答案: D

角色分为服务器级角色和数据库级角色。db_ datawriter角色属于数据库级角色,具有插入、删除和更改数据库中所有用户数据的权限。



1. 设在SQL Server 2008某数据库中有商品表和销售表,表的定义如下:

CREATE TABLE 商品表(

商品号    char(10) PRIMARY KEY,

商品名    char(20) NOT NULL,

销售总量  int  DEFAULT 0)


CREATE TABLE 销售表(

商品号      char(10),

销售时间    datetime,

销售数量    int NOT NULL,

PRIMARY KEY(商品号,销售时间),

FOREIGN KEY(商品号) REFERENCES 商品表(商品号))

现要创建一个具有如下功能的触发器:每当在销售表中插入一条销售记录时,修改商品表中对应商品的销售总量,假设一次只插入一条销售记录。请补全下列代码。

CREATE TRIGGER tri_insert on [1]_____ FOR [2]_____

AS

[3] _____ 商品表  [4] _____  销售总量= [5] _____  +

  (SELECT 销售数量 FROM [6]_____)

  WHERE 商品号 IN (SELECT 商品号 FROM Inserted)


【解题思路】

    使用FOR或AFTER选项定义的触发器为后触发器,即只有在引发触发器执行的语句中的操作都已成功执行,并且所有的约束检查也成功完成后,才执行触发器。而使用INSTEAD OF选顶定义的触发器为前触发器。这种模式的触发器中,指定执行触发器而不是执行引发触发器执行的SQL语句,从而替代引发语句的操作。

    在触发器语句中可以使用两个特殊的临时工作表:INSERTED表和DELETED表。这两个表是在用户自行数据的更改操作时,SQL Server自动创建和管理的。其中INSERTED表是用于存储INSERT和UPDATE语句所影响的行的副本。而DELETED表用于存储DELETE和UPDATED语句所影响的行的副本。

    建立触发器语法是:

Create TRIGGER trigger_name

ON { table | view }

{

{ { FOR |AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] }

AS

[{ IF Update (column )

[{ AND | or } Update ( column )]

[…n ]

| IF ( COLUMNS_UpdateD ( ) { bitwise_operator } updated_bitmask)

{ comparison_operator } column_bitmask […n ]

}]

sql_statement […n ]

}

}

    其中:参数trigger_name是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。

    Table | view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。

FOR或AFTER指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定FOR关键字,则AFTER是默认设置。不能在视图上定义AFTER触发器。

    INSTEAD OF指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。在表或视图上,每个Insert、Update或Delete语句最多可以定义一个INSTEAD OF触发器。然而,可以在每个具有INSTEAD OF触发器的视图上定义视图。INSTEAD OF触发器不能在WITH CHECK OPTION的可更新视图上定义。如果向指定了WITH CHECK OPTION选顶的可更新视图添加INSTEAD OF触发器,SQL Server将产生一个错误。用户必须用Alter VIEW删除该选顶后才能定义INSTEAD OF触发器。

    {[Delete] [,] [Insert] [,][Update] }是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选顶。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。对于INSTEAD OF触发器,不允许在具有ON Delete级联操作引用关系的表上使用Delete选项。同样,也不允许在具有ON Update级联操作引用关系的表上使用Update选项。

    AS是触发器要执行的操作。

    sql_statement是触发器的条件和操作。触发器条件指定其他准则,以确定Delete、Insert或Update语句是否导致执行触发器操作。

    从触发器的语法中可知,【1】处应该填写的是执行触发器的表,【2】处应该填写指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。从题目"CPEATE TRIGGER tri_insert on【1】FOR【2】"知,本题创建的触发器是是后触发器。该触发器的功能是"每当在销售表中插入一条销售记录时,修改商品表中对应商品的销售总量"。本题是在销售表上建立后触发器,需要执行的是插入语句。故可推导出【1】处应填写:销售表,【2】处应填写:INSERT。

    根据触发器语法规则知,AS是触发器要执行的操作。本题要求的是更新商品表中的销售总量。更新语句采用UPDATE关键字,其语法格式为:UPDATE 表名 SET语句。因此【3】处应填写:UPDATE,【4】处应填写:SET,【5】处应填写:商品表.销售总量。

    本题中,是使用INSERT和UPDATED关键字对商品表进行操作,因此影响的是INSERTED表的内容。故【6】处应填写:Inserted。

答案:[1]:销售表

      [2]:INSERT

      [3]:UPDATE

      [4]:SET

      [5]:销售总量或商品表.销售总量

      [6]:Inserted


2.在SQL Server 2008中,判断游标提取状态的全局变量是:@@ [1]_____

【解析】在对游标数据进行提取的过程中,可以使用@@FETCH_STATUS全局变量判断数据提取的状态。由于@@FETCH_STATUS对于在一个连接上的所有游标是全局性的,不管是对哪个游标,只要执行一次TETCH语句,系统都会对@@FETCH_STATUS赋一次值,以表明该FETCH语句的执行情況。

答案:FETCH_STATUS

你可能感兴趣的:(三、数据库后台编程技术)