当前位置:文档之家› 浅析SQL Server 2008中的代码安全之一:存储过程加密与安全上下文

浅析SQL Server 2008中的代码安全之一:存储过程加密与安全上下文

浅析SQL Server 2008中的代码安全之一:存储过程加密与安全上下文
浅析SQL Server 2008中的代码安全之一:存储过程加密与安全上下文

最近对SQL Server 2008的安全入门略作小结,以作备忘。本文主要是针对存储过程加密与安全来作分析。

<一>存储过程加密

其实,用了这十多年的SQL server,我已经成了存储过程的忠实拥趸。在直接使用SQL语句还是存储过程来处理业务逻辑时,我基本会毫不犹豫地选择后者。

理由如下:

1、使用存储过程,至少在防非法注入(inject)方面提供更好的保护。因为,存储过程在执行前,首先会执行预编译,(如果由于非法参数的原因)编译出错则不会执行,这要某种程度上提供一层天然的屏障。

我至今还记得大约八、九年前采用的一个权限控制系统就是通过拼凑一个SQL语句,最终得到了一个形如“ where 1=1 and dataID in (1,2) and ModelID in (2,455) And ShopID in (111) and departID in ( 1,3) and ([Name] like %myword%) ”的where条件子句来获取符合条件的结果集。

注意:这个参数是通过地址栏web应用的地址栏或Winform的UI界面来输入的,所以对恶意注入需要花费一定的成本来维护。因为一些常用的关键字(或敏感词)很难区分是恶意或非恶意。

2、使用存储过程而不是直接访问基表,可以提供更好的安全性。你可以在行级或列级控制数据如何被修改。相对于表的访问,你可以确认有执行权限许可的用户执行相应的存储过程。这也是访问数据服务器的惟一调用途径。因此,任何偷窥者将无法看到你的SELECT语句。换句话说,每个应用只能拥有相应的存储过程来访问基表,而不是“SLEECT *”。

3、存储过程可以加密。(这点非常实用,设想一下,您的数据库服务器是托管的或租用的,你是否能心安理得的每天睡个安稳觉。如果竞争对手“一不小心”登上你的SQL Server,或通过注入得到了你的存储过程,然后相应的注入恶意的SQL,将您的业务逻辑乱改一通,而恰巧您五分钟前又没做备份,那会怎么样?)

(注意:加密存储过程前应该备份原始存储过程,且加密应该在部署到生产环境前完成。)存储过程的加密非常简单,我们看一个例子:

插入测试表

https://www.doczj.com/doc/9f5435035.html,e testDb2

2.go

3./**********测试表*****************/

4.SET ANSI_PADDING ON

5.GO

6.CREATE TABLE [dbo].[tb_demo](

7.[id] [int] NOT NULL,

8.[submitdate] [datetime] NULL,

9.[commment] [nvarchar](200) NULL,

10.)

11.GO

12.SET ANSI_PADDING OFFGO

13.Insert into [tb_demo]

14.select 1024, getdate(),REPLICATE('A',100);

15.WAITFOR DELAY '00:00:04';

16.Insert into [tb_demo]

17.select 1024, getdate(),REPLICATE('B',50);

18.go

插入存储过程

1./***************创建未加密的存储过程*******************/

2.Create Procedure CPP_test_Original

3.AS

4.select * from [tb_demo]

5.go

6./***************创建加密的存储过程*******************/

7.Create Procedure CPP_test_Encryption

8.with encryption

9.AS

10.----可以换成任意的逻辑

11.execute CPP_test_Original

12.go

未加密的存储过程:

加密的存储过程:

此时,至少,存储过程的内容不会被轻易看到(虽然解密也是有可能的)。应用这个,我们可以对某些关键的存储过程进行加密。但此时,存储过程仍然能被execute、alter和drop。

<二>安全上下文

除了加密sql文本的内容,我们还可以使用EXECUTE AS子句设定存储过程的安全上下文,以满足不同的安全级别需求。

如果你对这些不感兴趣,请直接路过带下划线的段落。

(关于EXECUTE AS子句的详细用法,请参看

MSDN:https://www.doczj.com/doc/9f5435035.html,/zh-cn/library/ms188354.aspx)

此处,我们需要了解的是:

1、在 SQL Server 中,可以定义以下用户定义模块的执行上下文:函数(内联表值函数除外)、过程、队列和触发器。

通过指定执行模块的上下文,可以控制数据库引擎使用哪一个用户帐户来验证对模块引用的对象的权限。这有助于人们更灵活、有力地管理用户定义的模块及其所引用对象所形成的对象链中的权限。必须而且只需授予用户对模块自身的权限,而无需授予用户对被引用对象的显式权限。只有运行模块的用户必须对模块访问的对象拥有权限。

针对函数、过程、队列和触发器,对应的参数也不同。存储过程对应的参数包括(CALLER | SELF | OWNER | 'user_name')。

■CALLER指定模块内的语句在模块调用方的上下文中执行。执行模块的用户不仅必须对模块本身拥有适当的权限,还要对模块引用的任何数据库对象拥有适当权限。 CALLER 是除队列外的所有模块的默认值,与 SQL Server 2005 行为相同。 CALLER 不能在 CREATE QUEUE 或 ALTER QUEUE 语句中指定。

■SELF EXECUTE AS SELF 与 EXECUTE AS user_name 等价,其中指定用户是创建或更改模块的用户。创建或更改模块的用户的实际用户 ID 存储在sys.sql_modules或

sys.service_queues目录视图的execute_as_principal_id列中。SELF 是队列的默认值。

■OWNER 指定模块内的语句在模块的当前所有者上下文中执行。如果模块没有指定的所有者,则使用模块架构的所有者。不能为 DDL 或登录触发器指定 OWNER。注意:OWNER 必须映射到单独帐户,不能是角色或组。

■'user_name' 指定模块内的语句在 user_name 指定的用户的上下文中执行。将根据 user_name 来验证对模块内任意对象的权限。不能为具有服务器作用域的 DDL 触发器或登录触发器指定

user_name。请改用 login_name。user_name 必须存在于当前数据库中,并且必须是单独帐户。

user_name 不能是组、角色、证书、密钥或内置帐户,如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。执行上下文的用户 ID 存储在元数据中,可以在 sys.sql_modules 或 sys.assembly_modules 目录视图的 execute_as_principal_id 列查看。

2、所有权链具有以下限制:

仅适用于 DML 语句:SELECT、INSERT、UPDATE 和 DELETE。

调用和被调用对象的所有者必须相同。

不适用于模块内的动态查询。

我们看一个示例:

第一步、创建一个测试存储过程,用来delete表tb_Demo的所有数据

https://www.doczj.com/doc/9f5435035.html,E testDb2

2.GO

3.CREATE PROCEDURE dbo.[CPP_DEL_ALL_Tb_Demo]

4.AS

5.-- Deletes all rows prior to the data feed

6.DELETE dbo.[tb_Demo]

7.GO

第二步:创建一个账号TonyZhang,并赋于该账号对该存储过程的exec权限

https://www.doczj.com/doc/9f5435035.html,E master

2.GO

3.CREATE LOGIN TonyZhang WITH PASSWORD = '123b3b4'

https://www.doczj.com/doc/9f5435035.html,E testDb2

5.GO

6.CREATE USER TonyZhang

7.GO

8.GRANT EXEC ON dbo.[CPP_DEL_ALL_Tb_Demo] to TonyZhang

以该账号登录SQL Server,并执行:

1.EXECUTE dbo.CPP_DEL_ALL_Tb_Demo

2./**

3.(4 row(s) affected)

4.**/

注意:此时,虽然TonyZhang除了执行存储过程[CPP_DEL_ALL_Tb_Demo]之外没有任何其他权限,但仍然执行了存储过程,并删除了表记录。

如果我们修改存储过程为:

1.Alter PROCEDURE dbo.[CPP_DEL_ALL_Tb_Demo]

2.AS

3.-- Deletes all rows prior to the data feed

4.truncate table dbo.[tb_Demo]

5.GO

此时,再以TonyZhang登录,并执行存储过程,会提示:

这是因为所有者权链只限定在SELECT、INSERT、UPDATE 和 DELETE。而不包括Truncate,换句话说,系统授于的Exec只既定于SELECT、INSERT、UPDATE 和 DELETE

有人可能会问:如果在存储过程内部调用动态语句,而不是明确的表名,我们如何限定权限呢?

第三步:我们建立一个存储过程,功能是传入一个参数表名,查询该表的记录数。

2.@SchemaAndTable nvarchar(255)

3.AS

4.EXEC ('SELECT COUNT(1) FROM ' + @SchemaAndTable)

5.GO

授于Tonyzhang 以执行该存储过程的权限:

1.GRANT EXEC ON dbo.[CPP_SEL_CountRowsFromAnyTable] to TonyZhang

2.go

此时,以Tonyzhang登录,执行存储过程,会提示:

注意,此时,tonyzhang虽然有执行存储过程的权限,但是没有参数表的select权限,所以执行失败。

第四步:修改存储过程的上下文

创建一个新账号jackwang,赋于表tb_Demo的select权限

https://www.doczj.com/doc/9f5435035.html,E master

2.GO

3.CREATE LOGIN JackWang WITH PASSWORD = '123b3b4'

https://www.doczj.com/doc/9f5435035.html,E Testdb2

5.GO

6.CREATE USER JackWang

7.GRANT SELECT ON OBJECT::dbo.[tb_Demo] TO JackWang

8.GO

9./*******

10.注意:此时,JackWang 可以执行dbo.[tb_Demo的Select

11.*******/

修改存储的执行者

https://www.doczj.com/doc/9f5435035.html,E Testdb2

2.GO

4.@SchemaAndTable nvarchar(255)

5.WITH EXECUTE AS'JackWang'

6.AS

7.EXEC ('SELECT COUNT(1) FROM ' + @SchemaAndTable)

8.GO

注意:这样,我们再调用存储过程[CPP_SEL_CountRowsFromAnyTable]时,会自动以JackWang的身份运行该存储过程。

此时,我们仍以Tonyzhang登录,再执行:

小结:

本文通过简单的两个示例开始SQL server代码的安全之旅,

1、存储过程的加密,(注意:加密存储过程前应该备份原始存储过程,且加密应该在部署到生产环境前完成。)

(主要是对SELECT、INSERT、2、存储过程的安全上下文。可以通过上下文设置更加严格的数据访问级别。

UPDATE 和 DELETE语句的访问限制)

后续部分将会涉及SQL server 2008新增的透明加密(TDE)功能。

原文链接:https://www.doczj.com/doc/9f5435035.html,/downmoon/archive/2011/02/28/1966662.html

SQL_Server_2008数据库试题(C)

SQL Server 2008网络数据库试题C 班级:学号:_________ 姓名:分数 一.单项选择题(每小题2分,共50分) 1. 在概念设计阶段可用E-R图,其中矩形表示实体,()表示实体联系 A. 圆形框 B. 椭圆形框 C. 箭头 D .菱形框 2. 通过使用文件组,可以()。 A. 提高存取数据的效率。 B.提高数据库备份与恢复的效率 C. 简化数据库的维护 D. ABC都可以。 3. 下列四项中不属于数据库特点的是() A. 数据共享 B. 数据完整性 C. 数据冗余高 D. 数据独立性 4. 不同实体间可以有() A. 只有一种联系 B. 可以有多种联系 C .不能有联系 D.只有多对多联系 5. 建立在计算机外部设备上的结构化的有联系的数据集合是() A. 数据库 B. 数据库管理系统 C. 数据结构 D .数据文件 6. 实体间存在多种联系,下面那种数据模型可以描述实体间多对多的联系() A. 层次模型 B. 网状模型 C. 关系模型 D. 对象模型 7. ()是位于用户和操作系统之间的一层数据管理软件。数据库在建立,使用和维护时由其统一管理,统一控制。 A.DBMS(数据库管理系统) B. DB(数据库) C. DBS(数据库系统) D .DBA(数据库管理员) 8. SQL语言允许使用通配符进行字符串匹配的操作,其中‘%’可以表示() A .零个字符 B .1个字符串 C.多个字符串 D. 以上都是 9. 英文缩写DBA代表()

A. 数据库管理系统 B. 数据库管理员 C. 数据定义语言 D. 数据库操纵语言 10 以下不是SQL数据定义语言的是() A. CREATE B .DROP C. SELECT D. ALTER 11. 下面聚集函数中哪个只能用于计算数值类型的数据() A. COUNT( ) B. MIN( ) C .MAX( ) D .SUM( ) 12. 以下哪个关键字用来定义记录在某属性上的约束条件() A. DEFAULT B. CONSTRAINT C. UNIQUE D. CHECK 13. 欲往表中增加一条记录,应该用哪一条SQL语句() A. ALTER TABLE B. INSERT INTO TABLE C. CREA TE TABLE D . DROP TABLE 14. 以下哪一个不是逻辑运算符() A. NOT B .AND C. OR D. IS 15. 在创建表的过程中,哪个关键字用来定义默认值() A. DISTINCT B .UNIQUE C. CHECK D. DEFAULT 16. 以下哪些描述符合数据库阶段的特点() 1) 文件的组织形式可以是顺序的,也可以是随机的 2)数据结构化 3)数据可以共享 4)程序独立于数据 5)统一的数据管理功能 6)数据面向应用 7)数据不保存 A. 1) 2) 7) B. 2) 3) 4) 5) C.2) 4) 5) D .2) 3) 5) 6) 17. 主键约束用来强制数据的()完整性。 A .域 B. 实体 C. 参照 D. ABC都可以 18. 学校中有若干系,每个系有若干班级和教研室,每个教研室有若干教员,其中有的教授和副教授各带若干研究生,每位研究生均只有一名导师,每个班有若干学生,每个学生选修若干课程,每门课可以由若干学生选修。请选出一下描述

SQLServer存储过程返回值总结.

SQLServer 存储过程返回值总结 1. 存储过程没有返回值的情况 (即存储过程语句中没有 return 之类的语句用方法 int count = ExecuteNonQuery(..执行存储过程其返回值只有两种情况 (1假如通过查询分析器执行该存储过程,在显示栏中假如有影响的行数,则影响几行 count 就是几 (2假如通过查询分析器执行该存储过程, 在显示栏中假如显示 ' 命令已成功完成。 ' 则 count = -1;在显示栏中假如有查询结果,则 count = -1 总结:A.ExecuteNonQuery(该方法只返回影响的行数,假如没有影响行数,则该方法的返回值只能是 -1,不会为 0。 B.不论 ExecuteNonQuery(方法是按照 CommandType.StoredProcedure 或者 CommandType.Text 执行, 其效果和 A 一样。 --------------------------------------------------------------------------------------------------------------------------------------------------- 2. 获得存储过程的返回值 --通过查询分析器获得 (1不带任何参数的存储过程 (存储过程语句中含有 return ---创建存储过程 CREATE PROCEDURE testReturn AS return 145 GO ---执行存储过程

DECLARE @RC int exec @RC=testReturn select @RC ---说明 查询结果为 145 (2带输入参数的存储过程 (存储过程语句中含有 return ---创建存储过程 create procedure sp_add_table1 @in_name varchar(100, @in_addr varchar(100, @in_tel varchar(100 as if(@in_name = '' or @in_name is null return 1 else begin insert into table1(name,addr,tel values(@in_name,@in_addr,@in_tel return 0

SQLServer2008大数据库精彩试题

2009-2010学年第二学期科大讯飞公司 SQL Server 2008数据库试题 合作院校: 班级: : 分数 一、 单项选择题(每题2分,共25题,合计50分) 1. SQL Server 2008是一个( )的数据库 系统。 (A )网状型 (B )层次型 (C )关系型 (D )以上都不是 2.关于主键描述正确的是:( ) (A )包含一列 (B )包含两列 (C )包含一列或者多列 (D ) 以上都不正确 3. SQL Server 2008 采用的身份验证模式有( )。 (A )仅Windows 身份验证模式 (B )仅SQL Server 身份验证模式 (C )仅混合模式 (D )Windows 身份验证模式和混合模式 4. SQL 语言按照用途可以分为三类,下面选项中哪一种不是的:( ) (A )DML (B )DCL (C )DQL (D )DDL 5. 在SELECT 语句的WHERE 子句的条件表达式中,可以匹配0个到多

个字符的通配符是() (A) * (B)% (C)- (D)? 6. SQL Server提供的单行注释语句是使用()开始的一行容。(A)“/*” (B)“--” (C)“{” (D)“/” 7. 以下那种类型不能作为变量的数据类型()。 (A)text (B)ntext (C)table (D)image 8. 下面不属于数据定义功能的SQL语句是:() A.CREATE TABLE B.CREATE CURSOR C.UPDATE D.ALTER TABLE 9. 如果希望完全安装SQL Server,则应选择()。 A. 典型安装 B. 最小安装 C. 自定义安装 D. 仅连接 10. 在SQL SERVER中局部变量前面的字符为:() (A)* (B)# (C)(D) 11. 假如有两个表的连接是这样的: table_1 INNER JOIN table_2 其中table_1和table_2是两个具有公共属性的表,这种连接会生成哪种结果集?() (A)包括table_1中的所有行,不包括table_2的不匹配行 (B)包括table_2中的所有行,不包括table_1的不匹配行 (C)包括和两个表的所有行 (D)只包括table_1和table_2满足条件的行 12. 对视图的描述错误的是:() (A)是一虚拟的表 (B)在存储视图时存储的是视图的定义

SQLServer 2008以上误操作数据库恢复方法

SQLServer 2008以上误操作数据库恢复方法——日志尾部备份 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的时候没有加where,然后就喊爹喊娘了。人非圣贤孰能无过,做错可以理解,但不能纵容,这个以后再说,现在先来解决问题。遇到这种情况,一般都是没有做备份,不然也不会来发问了。首先要冷静,否则会有更大的灾难。直到你放弃。 解决方法: 对于这类问题,主要是找回误操作之前的数据,在2008之前,有个很出名的工具Log Exploer,听说还挺好用的,这个网上大把教程,这里就不多说了。但是唯一遗憾的是,不支持2008及更高版本,这时除了其他第三方工具,那么最常用的就是本文提到的方法——日志尾部备份。本文实验环境2008R2,对于2008及其以上版本可以使用这个方法,其实2005也可以,2000很少用,没试过,只是2008之前可以使用Log Exploer,所以就没必要用这种方法。 下面图文并茂讲解操作方法,至于原理,不属于本文范围,而且我相信真遇到误操作的时候,估计没人会看原理了。 步骤: (1)、检查数据库的恢复模式,如图:

或者使用脚本检查: 1.SELECT recovery_model,recovery_model_desc 2.FROM sys.databases 3.WHERE name='AdventureWorks' 结果如下: 确保数据库的恢复模式最起码不能为【简单】。至于如何修改成完整模式,我觉得这些应该没必要多说了。 切记,对于任何重要环境,不仅仅是客户正式环境(俗称生产环境),都强烈建议使用【完整恢复模式】,虽然对于另外两种(大容量日志(BULK_LOGGED)、简单(SIMPLE))来说,完整恢复模式产生的日志会大,但是在出现问题的时候,就会觉得这些都不算什么了。并且我也想不到任何理由对于正式环境不使用完整恢复模式。只要管理得当,完整恢复模式的日志也不会太变态。 (2)、这里其实隐含另外一步,曾经做过最少一次的完整备份。因为所有类型的备份都基于完整备份,如果没有最少一次完整备份,其他类型的备份都是多余的,所以在这里强调一下,在创建完一个新数据库之后,强烈建议甚至强制做一次完整备份。 1.SELECT database_name,recovery_model,name 2.FROM msdb.dbo.backupset 使用上面的语句粗略可以看到有那些数据库做过备份,由于测试,所以做了几次备份,可以看到我这个时间点已经做了备份了。 (3)、确保别人不再连接数据库,然后做一次日志尾部备份: 首先先创建一点数据: [sql]view plaincopyprint?

(SQLServer)考试试题及答案

2013年(下)全国信息技术水平考试数据库应用系统设计技术水平证书 (SQL Server)考试试卷 第一大题:单选题(30 分) 1. (1分) 数据模型的三要素不包括()。 (A) 数据结构(B) 数据操作(C) 数据完整性约 束(D) 数据恢复 2. (1分) 数据的存储结构与数据逻辑结构之间的独立性称为数据的 ()。 (A) 结构独立性(B) 物理独立性(C) 逻辑独立 性(D) 分布独立性 3. (1分) 如果对于实体集A中的每一个实体,实体集B中可有多个实体与之联 系;反之,对于实体集B中的每一个实体,实体集A中也可有多个实体与之联系。则称实体集A与B具有()。 (A) 1:1联系(B) 1:n联系(C) n:m联 系(D) 多种联系 4. (1分) 当对关系R和S使用自然联接时,一般要求R和S至少含有一个共同的()。 (A) 元组(B) 关键字(C) 记 录(D) 属性 5. (1分) 若关系模式R(A,B,C,D,E)上的函数依赖集F={AB->C,A->D,A->E},为了满足BCNF,可以将R分解为()。 (A) R1(A,B,C,D) R2(A,E) (B) R1(A,B,C) R2(A,D,E) (C) R1(A,B,C) R2(D,E) (D) R1(A,B) R2(A,C,D,E) 6. (1分) SQL语言查询一次的结果是一个()。 (A) 元组(B) 表(C) 属性(D) 数据

库 7. (1分) 在关系模式R(U,F)中,如果X→Y,且存在X的真子集X1,使X1→Y,则称函数依赖X→Y为()。 (A) 平凡函数依赖 (B) 部分函数依赖 (C) 完全 函数依赖 (D) 传递函数依赖 8 . (1分) 在Transact-SQL中,下列命令能让程序完全跳出循环的是( )。 (A) CASE (B) WAIT (C) BREAK (D) CONTINU E 9 . (1 分) 在Transact-SQL中,下列选项不属于数值型数据类型的是( )。 (A) NUMERIC (B) DECIMAL (C) INTEGER (D) DATE 10. (1分) 下列选项中,可以正确表达姓“张”的通配符是( )。 (A) 张 _ (B) 张 % (C) 张 ^ (D) 张& 1 1. (1 分) 下列聚合函数中正确的是( )。 (A) SUM (*) (B) MAX (*) (C) COUNT (*) (D) AVG (*) 12. (1 分) 如果某一列的数据类型是FLOAT,则不允许对该列使用的函数是( )。 (A) SUM (B) ABS (C) LEFT (D) ROUND 13 . (1 分 ) 在SQL的SELECT语句中,与投影运算对应的子句是( )。 (A) SELECT (B) FROM (C) WHERE (D) GROU P BY 14. (1 分) 在SQL语言中,给表起别名应使用( )。 (A) AS (B) RENAME (C) SET (D) FOR 15. (1分) 在SELECT语句中使用GROUP BY SNO时,SNO必须() 。 (A) 在WHERE中出现 (B) 在FROM中出现

SqlServer存储过程基本语法

动态语句基本语法 1 :普通SQL语句可以用exec执行 Select * from tableName exec('select * from tableName') exec sp_executesqlN'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL declare @fnamevarchar(20) set @fname = 'FiledName' Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格 当然将字符串改成变量的形式也可 declare @fnamevarchar(20) set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) set @s = 'select ' + @fname + ' from tableName' exec(@s) -- 成功 exec sp_executesql @s -- 此句会报错 declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) set @s = 'select ' + @fname + ' from tableName' exec(@s) -- 成功 exec sp_executesql @s -- 此句正确 3. 输出参数 declare @numint, @sqlsnvarchar(4000) set @sqls='select count(*) from tableName' exec(@sqls) --如何将exec执行结果放入变量中? declare @numint, @sqlsnvarchar(4000) set @sqls='select @a=count(*) from tableName ' execsp_executesql @sqls,N'@aint output',@num output select @num 1 :普通SQL语句可以用Exec执行例: Select * from tableName Exec('select * from tableName')

SQL server 2008 数据库置疑的处理办法

SQL server 2008 数据库置疑的处理办法 1 把问题数据库备份后直接删除 停掉SQLSERVER服务,把服务器上出问题的数据库, 假设名称为ErrorDB的数据库文件及日志文件备份到其他目录,然后直接将其删除,把其数据库文件及日志文件也删除 2 新建同名数据库 启动SQLSERVER服务,新建同名数据库ErrorDB,文件目录和日志和原来一致 3 用备份的数据库文件替换新的数据库文件 停掉SQLSERVER服务,把备份的数据库文件替换新的数据库文件(只替换数据库文件,不替换日志文件) 启动SQLSERVER服务,打开数据库,这时数据库应该是不能访问的 -------------------设置应急模式、单用户模式、检查修复数据,取消单用户模式 ---------------------- 4 将数据库设置为应急状态 alter database ErrorDB set emergency 执行后,为了保险起见,重新停止、开启的SQLSERVER服务 再打开数据库,已经可以看到里面的内容了,如表,视图,存储过程等 数据库名称后有紧急标志,能看到数据库结构,但无法进行备份等操作 5 将数据库设置为单用户模式 ALTER DATABASE ErrorDB SET SINGLE_USER 6 对数据库进行检查修复 dbcc checkdb(EIMSDb,REPAIR_ALLOW_DATA_LOSS) dbcc checkdb(EIMSDb,REPAIR_REBUILD) 操作后,仍然停止启动SQLSERVER服务(不确定是否需要,我只是为了想无干扰查看执行后的数据库状况)重新打开数据库,已经是正常状态了,没有应急提示了 7 取消单用户模式 exec sp_dboption EIMSDb, N'single', N'false'

SQL-Server-2008中文版基础教程测精彩试题(一套)问题详解

SQL Server 2008基础教程测试题(一套) 答案 一填空题(每题2分,共22分) 1.SQL Server 2008的数据库管理程序分为服务器程序和客户端程序两部分,两部分 可以安装在同一台计算机上,也可以分别安装在不同的计算机上。 2.SQL Server的数据文件有逻辑名称和操作系统文件名两种名称。 3.表是反映现实世界某类事物的数学模型,表由行和列组成。现实世界中事物的属性对应 表的列,表中的一行代表一类事物中的一个特例。 4.主键是唯一能够区分表中每一行记录的一个或多个列。 5.在select子句中代表全部列的通配符是*。 6.常用的聚合函数有:计算最大值的max,计算最小值的min,统计总和的sum,统计 记录总数的count和计算平均值的avg。 7.视图和表都是数据库中的对象,视图的结构虽然与表相同,但视图是虚表。 8.联接查询的含义是指两个存在关联关系的表A和B,表A与表B联接的查询结果为C, 结果集C中只能包括表A与表B中满足关联条件的记录。 9.左联接查询的含义是指两个存在关联关系的表A和B,表A与表B左联接的查询结果 为C。C的列可以来自于A和B的列,C的记录中允许包括表A的全部记录以及表A 中与表B满足关联条件的记录,C中A与B不满足关联条件的列值为空值。 10.全联接的含义是指两个存在关联关系的表A和B,表A与表B全联接的查询结果为C。

C的列可以来自于A和B的列,C的记录中可以包括表A和表B的全部记录,C中B 与A以及A与B不满足关联条件的部分为空值。 11.SQL Server的导入、导出数据操作也称为数据移植,是指在SQL Server数据库之间、 SQL Server数据库与其他异构数据库之间、SQL Server数据库与Excel文件和文本文件之间互相传递数据的操作。 二选择题(每题2分,共20分) 1.同一台计算机上可以运行(D)个实例。 A.一个 B.两个 C.三个 D.多个 2.每一个数据库都有(A)的标识,这个标识就是数据库名称。 A.一个唯一 B.多个 C.两个 D.不同 3.表是反映现实世界中一类事务的数学模型,现实世界中一类事务的属性是表中的(A)。 A.列 B.行 C.记录 D.数值 4.如果一个表中记录的物理存储顺序与索引的顺序一致,则称此索引为(B)。

安装SQL Server 2008 注意及问题解决

SQL Server 2008 安装过程及部分错误解决 本文分为三部分: 一、SQL Server 2008完全卸载过程 二、SQL Server 2008安装过程 三、我在安装过程中所遇到的问题及解决办法 (1)创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke的错误解决办法(2)找不到方法 “boolean microsoft.sqlserver.configuration.msiextensionmetadata.get_isslipstreamorpatch()" (3)“试图执行未授予权限” (4)出现以下错误:对路径 “C:\Windows\system32\perf-ReportServer$MSSQLSERVER3-rsctr.dll”的访问被拒绝。(5)“重启电脑失败” 一、SQL Server 2008完全卸载 1、程序与功能中,右键SQL Server 2008删除 2、进入删除SQL Server 2008,一路下一步下去

3、在程序和功能中,还有SQL Server 2008相关 如果前面卸载比较顺利,相关的组件不多,继续删除SQL Server 2008 Native Client等红框中的组件 4、如果前面没有卸载干净,下载Windows Installer Clean UP选择SQL Server 2008相关移除

再使用SRVINSTW移除SQL Server 2008相关服务。我后来卸载的时候,在程序和功能卸的就很干净,用不着这两个小工具了。 5、清理注册表:开始-运行-regedit.exe 在注册表里找到对应的文件夹,删除 (1)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ Microsoft SQL Server (2)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Native Client 10.0 (3)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer (4)HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server 下面是我在网上搜到还需要删除的文件夹,但是我一般就删除上面的文件夹就好。 ④HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLServer ⑤HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SQLSERVER AGENT ⑥HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \MSSQLServerADHelper 6、找到C盘Program Files里Microsoft SQL Server,Microsoft SQL Server Compact Edition文件夹,删除。如果当初装在别的盘就去相对应的位置找,但C盘Microsoft SQL Server文件夹还要删。删除不顺利用360强力删除。 7、重启计算机

《SQL Server数据库技术》试卷J

健雄职业技术学院 考试试卷 说明:本次考试 120 分钟, 42 道小题,共计 5 页,总分 100 分 J 考试科目 SQL Server 数据库技术 考试类型 高职期末考试 『闭卷』 学年学期 适用专业 年 级 教研室主任

(装订线内不准做答) Ⅰ理论题部分 (注意:所有答案都应按要求回答在试卷最后一页答题卷上,在试卷上直接作答的无效) 一、选择题(在每个小题四个备选答案中选出一个正确答案) (本大题共10小题,每小题1分,总计10分) 1.SQL Server 2000 属于()数据库系统。 A .层次模型 B .网状模型 C .关系模型 D .面向对象模型 2.关系数据表的关键字可由()字段组成。 A .一个 B .两个 C .多个 D .一个或多个 3.字符串常量使用()作为定界符。 A .单引号 B .双引号 C .方括号 D .花括号 4.下列叙述错误 ..的是()。 A .ALTER TABLE 语句可以添加字段 B .ALTER TABLE 语句可以删除字段 C .ALTER TABLE 语句可以修改字段名称 D .ALTER TABL E 语句可以修改字段数据类型 5.表设计器的“允许空”单元格用于设置该字段是否可输入空值, 实际上就是创建该字段的()约束。 A .主键 B .外键 C . 非空 D . 检查 6.下列语句中正确 ..的是()。 表 score(sti_id,names,math,English,VB) A.select stu_id,sum(math) from score B.select sum(math),avg(VB) from score C.select * ,sum(english) from score D.delete * from score 7.SQL server 数据库文件有三类,其中主数据文件的后缀为()。 A . .ndf B . .ldf C . .mdf D . .idf 8.表达式 Datepart ( yy,‘2004-3-13’) +2 的结果是()。 A . ' 2004-3-15 ' B . 2004 C . '2006' D . 2006 9.下列途径哪个不是 ..实现值域完整性()。 A . rule( 规则) B . primary key C . not null D . default

SqlServer存储过程的事务模式编写

SQL Server在存储过程中编写事务处理代码的三种方法 SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码。希望能够对您有所帮助。 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran 这样编写的SQL存在很大隐患。请看下面的例子: create table demo(id int not null) go begin tran insert into demo values (null) insert into demo values (2) commit tran go 执行时会出现一个违反not null 约束的错误信息,但随后又提示(1 row(s) affected)。我们执行select * from demo 后发现insert into demo values(2) 却执行成功了。这是什么原因呢? 原来SQL Server在发生runtime 错误时,默认会rollback引起错误的语句,而继续执行后续语句。 如何避免这样的问题呢? 有三种方法:

1. 在事务语句最前面加上set xact_abort on set xact_abort on begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran go 当xact_abort 选项为on 时,SQL Server在遇到错误时会终止执行并rollback 整个事务。 2. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。 begin tran update statement 1 ... if@@error<>0 begin rollback tran goto labend end delete statement 2 ... if@@error<>0 begin rollback tran goto labend end commit tran labend: go 3. 在SQL Server 2005中,可利用try...catch 异常处理机制。

SQL Server 2008登录问题(错误 233和18456)解决方法

今天使用 SQLSERVER2008 先遇到了233 错误,后又遇到了 18456 ,从网上找到了解决方法,具体如下: 一、原 帖https://www.doczj.com/doc/9f5435035.html,/luckcq@yeah/blog/static/1717477072011322102075 36/ 问题:已成功与服务器建立连接,但是在登录过程中发生错取。(provider:共享内存提供程序,error:0-管道的另一端上无任何进程。)(Microsoft SQL Server,错误:233) 解决方法:打开‘程序’-‘所有程序’-‘Microsoft SQL Server 2008 ’-‘配置工具’-‘SQL Server 配置管理器’,在弹出的窗体中,找到‘SQL Server 2008 网络配置’,把‘MSSQLSERVER的协议’下的“Named Pipes”和“TCP/IP”启动,然后重新启动Microsoft SQL Server 2008就可以了。 二、原帖https://www.doczj.com/doc/9f5435035.html,/qishuangquan/article/details/6024767 问题: SQLSERVER2008 18456错误 我是这么解决的: 1、以windows验证模式进入数据库管理器。

第二步:右击sa,选择属性:

在常规选项卡中,重新填写密码和确认密码(改成个好记的)。把强制实施密码策略去掉。 第三步:点击状态选项卡:勾选授予和启用。然后确定 第四步:右击实例名称(就是下图画红线的部分),选择属性。

第五步:点安全性,确认选择了SQL SERVER 和Windows身份验证模式。 第六步:重启SQLSERVER服务(重要)。 最后,如果数据服务器打开开了防火墙,请增加访问规则,添加TCP1433端口的

SQL_Server数据库试题五及答案

SQL Server数据库试卷5 CCDDA BBBAB CBACD 一、单项选择题(每题2分,共15题) 1、SQL Server 2000是一个( C )的数据库系统。 (A)网状型(B)层次型(C)关系型(D)以上都不是 2、SQL Server 2000 企业版可以安装在操作系统上。C (A)Microsoft Windows 98 (B)Microsoft Windows 2000 Professional (C)Microsoft Windows 2000 Server (D)Microsoft Windows XP 3、SQL Server 2000 采用的身份验证模式有( D )。 (A)仅Windows身份验证模式 (B)仅SQL Server身份验证模式 (C)仅混合模式 (D)Windows身份验证模式和混合模式 4、SQL Server 2000提供了一整套管理工具和实用程序,其中负责启动、暂停和停止SQL Server的4种服务的是( D )。 (A)企业管理器(B)导入和导出数据(C)事件探察器(D)服务管理器 5、SQL Server 2000中的数据以页为基本存储单位,页的大小为( A )。 (A)8KB (B)16KB (C)32KB (D)64KB 6、新安装SQL Server后,默认有六个内置的数据库,其中的两个范例数据库是Pubs和( B )。 (A)master (B)NorthWind (C)msdb (D)bookdb 7、在SQL Server 2000中,当数据表被修改时,系统自动执行的数据库对象是(B )。(A)存储过程(B)触发器(C)视图(D)其他数据库对象 8、SQL Server的字符型系统数据类型主要包括(B)。 A. Int、money、char B. char、varchar、text C. datetime、binary、int D. char、varchar、int 9、在SQL Server 2000中,索引的顺序和数据表的物理顺序相同的索引是(A )。(A)聚集索引(B)非聚集索引(C)主键索引(D)唯一索引 10、要查询book表中所有书名中包含“计算机”的书籍情况,可用( B)语句。(A) SELECT * FROM book WHERE book_name LIKE ‘计算机*’ (B) SELECT * FROM book WHERE book_name LIKE ‘计算机%’ (C) SELECT * FROM book WHERE book_name = ‘计算机*’ (D) SELECT * FROM book WHERE book_name = ‘计算机%’ CBACD 11、SELECT语句中与HA VING子句通常同时使用的是(C)子句。 A.ORDER BY B.WHERE C.GROUP BY D.无需配合 12、要删除mytable表中的myindex索引,可以使用( B)语句。

SqlServer 使用存储过程 导出为Excel

SqlServer 使用存储过程导出为Excel 一个脱离office组件的可以将语句结果导出到Excel的过程 --1.执行时所连接的服务器决定文件存放在哪个服务器 [sql]view plain copy print? 1.CREATE PROC ExportFile 2. @QuerySql VARCHAR(max) 3. ,@Server VARCHAR(20) 4. ,@User VARCHAR(20) = 'sa' 5. ,@Password VARCHAR(20) 6. ,@FilePath NVARCHAR(100) = 'c:\ExportFile.csv' 7.AS 8.DECLARE @tmp VARCHAR(50) = '[##Table' + CONVERT(VARCHAR(36),NEWID())+']' 9.BEGIN TRY 10.DECLARE @Sql VARCHAR(max),@DataSource VARCHAR(max)=''; 11.--判断是否为远程服务器 12. IF @Server <> '.'AND @Server <> '127.0.0.1' 13.SET @DataSource = 'OPENDATASOURCE(''SQLOLEDB'',''Data Source='+@Server+';User ID='+@Us er+';Password='+@Password+''').' 14.--将结果集导出到指定的数据库 15.SET @Sql = REPLACE(@QuerySql,' from ',' into '+@tmp+ ' from ' + @DataSource) 16. PRINT @Sql 17.EXEC(@Sql) 18. 19.DECLARE @Columns VARCHAR(max) = '',@Data NVARCHAR(max)='' 20.SELECT @Columns = @Columns + ',''' + name +''''--获取列名(xp_cmdshell导出文件没有列名) 21. ,@Data = @Data + ',Convert(Nvarchar,[' + name +'])'--将结果集所在的字段更新为nvarchar(避 免在列名和数据union的时候类型冲突) 22.FROM tempdb.sys.columns WHERE object_id = OBJECT_ID('tempdb..'+@tmp) 23.SELECT @Data = 'SELECT ' + SUBSTRING(@Data,2,LEN(@Data)) + ' FROM ' + @tmp 24.SELECT @Columns = 'Select ' + SUBSTRING(@Columns,2,LEN(@Columns)) 25.--使用xp_cmdshell的bcp命令将数据导出 26.EXEC sp_configure 'xp_cmdshell',1 27. RECONFIGURE 28.DECLARE @cmd NVARCHAR(4000) = 'bcp "' + @Columns+' Union All ' + @Data+'" queryout ' + @Fi lePath + ' -c' + CASE WHEN RIGHT(@FilePath,4) = '.csv'THEN' -t,'ELSE''END + ' -T' 29. PRINT @cmd 30.exec sys.xp_cmdshell @cmd 31.EXEC sp_configure 'xp_cmdshell',0 32. RECONFIGURE 33.EXEC('DROP TABLE ' + @tmp) 34.END TRY 35.BEGIN CATCH

SQL Server 数据库试题与答案B卷

《SQL Server 数据库》B卷系别:________班级:________学号:________姓名:________ 1.本试卷为闭卷考试。 2.考试时间:120分钟 3.本试卷满分:100分 4.试卷适用班级:09高职软件技术班 一、单选题:(共2分,共30题,每小题的四个备选项中,只有一项是正确的,不选,错选均不得分) 1、Microsoft SQL Server是一种基于客户机/服务器的关系型数据库管理系统,它使用( B )语言在服务器和客户机之间传送请求。 A)TCP/IP B)T-SQL C)C D)ASP 2、( A )是一个图形界面的查询工具,用它可以提交T—SQL语言,然后发送到服务器,并返回执行结果,该工具支持基于任何服务器的任何数据库连接。 A)SQL Server Management Studio B)事件探查器 C)SQL管理对象D)DTS 3、( A )是用于存储、处理和保护数据的核心组件。 A)数据库引擎B)集成服务 C)报表服务D)通知服务 4、( A )是一个具有访问网络资源权限的Windows操作系统账户。 A)本地系统账户B)网络服务账户 C)本地服务账户D)域用户账户 5、数据库系统中负责数据库系统的建立、维护和管理的人员是( D ) A)最终用户 B)应用程序员 C)系统分析员 D)数据库管理员 6、数据库设计过程中,( C )将E—R图转换为关系模式并进行关系规范化。 A)需求分析阶段 B)概念结构设计阶段 C)逻辑结构设计阶段D)物理结构设计阶段 7、强制关系中的主属性不能为空,满足以下( A ) A)实体完整性B)参照完整性 C)用户定义完整性D)域完整性 8、数据库设计规范化的第三范式除了要满足第一、第二范式外,还要满足( C )A)每个记录的列只能有一个值 B)所有非主键列的值都只能由主键列中决定

列出SQLServer数据库中所有的存储过程

列出SQLServer数据库中所有的存储过程 Dim cn As rdoConnection Dim ps As rdoPreparedStatement Dim rs As rdoResultset Dim strConnect As String Dim strSQL As String '利用 DSNless 连接到 pubs 数据库 '改变参数以适合你自己的 SQL Server strConnect = "Driver={SQL Server}; Server=myserver; " & "Database=pubs; Uid=sa; Pwd=" Set cn = rdoEnvironments(0).OpenConnection(dsName:="", Prompt:=rdDriverNoPrompt, ReadOnly:=False, Connect:=strConnect) strSQL = "Select https://www.doczj.com/doc/9f5435035.html,,https://www.doczj.com/doc/9f5435035.html,,https://www.doczj.com/doc/9f5435035.html,,sc.length " & "FROM syscolumns sc,master..systypes st,sysobjects so " & "WHERE sc.id in (select id from sysobjects where type ='P')" & " AND so.type ='P' " & "AND sc.id = so.id " & "AND sc.type = st.type " & "AND sc.type <> 39" Set ps = cn.CreatePreparedStatement("MyPs", strSQL) Set rs = ps.OpenResultset(rdOpenStatic) list1.AddItem "SP Name,Param Name,Data Type,Length" While Not rs.EOF list1.AddItem rs(0) & " , " & rs(1) & " , " & rs(2) & " , " & rs(3) rs.MoveNext Wend rs.Close Set rs = Nothing cn.Close Set cn = Nothing 【

SQL_Server_2008数据库试题(B)

SQL Server 2008网络数据库试题B 班级:学号:_________ 姓名:分数 一、单项选择题(每题1分,共15题,合计30分) 1.SQL的视图是从()中导出的。 A. 基本表 B. 视图 C. 基本表或视图 D. 数据库 2. SQL 语言按照用途可以分为三类,下面选项中哪一种不是的:() A.DML B.DCL C.DQL D.DDL 3. 在SELECT语句的WHERE子句的条件表达式中,可以匹配0个到多个字符的通配符是() A. * B.% C.- D.? 4. SQL Server提供的单行注释语句是使用()开始的一行内容。 A. “/*” B. “--” C. “{” D. “/” 5. 以下那种类型不能作为变量的数据类型()。 A.text B.ntext C.table D.image 6. 下面不属于数据定义功能的SQL语句是:() A.CREATE TABLE B.CREATE CURSOR C.UPDATE D.ALTER TABLE 7. 假如有两个表的连接是这样的: table_1 INNER JOIN table_2 其

中table_1和table_2是两个具有公共属性的表,这种连接会生成哪种结果集?() A. 包括table_1中的所有行,不包括table_2的不匹配行 B. 包括table_2中的所有行,不包括table_1的不匹配行 C. 包括和两个表的所有行 D. 只包括table_1和table_2满足条件的行 8. 对视图的描述错误的是:() A. 是一张虚拟的表 B. 在存储视图时存储的是视图的定义 C. 在存储视图时存储的是视图中的数据 D. 可以像查询表一样来查询视图 9. 在T-SQL语言中,若要修改某张表的结构,应该使用的修改关键字是()。 A.ALTER B.UPDATE C.UPDAET D.ALLTER 10. SQL Server 2008提供了一整套管理工具和实用程序,其中负责启动、暂停和停止SQL Server的4种服务的是()。 A.企业管理器 B.导入和导出数据 C.事件探察器 D.服务管理器 11.在Transact-SQL语法中,SELECT语句的完整语法较复杂,但至少包括的部分(___)。 A.SELECT,INTO B.SELECT,FROM C.SELECT,GROUP D.仅SELECT

相关主题
文本预览
相关文档 最新文档