SQL Server LocalDB 在 ASP.NET中的应用介绍

我相信世界总是会向更好的方向发展,今年的维也纳新年音乐会没有往年的明星级指挥,但是它通过回归奥地利的本质,以更传统的聚合法则,让过往的艺术家们一代代创造的灿烂,在新的指挥手中,迸发出更深邃的音节。在此,也祝大家新年快乐。
如同交响乐一样,构造软件系统不一定必须某个强大的明星驱动,我们站在历代ADO.NET的肩膀上,更好地回归到SQL Server的核心开发:SQL Server LocalDB 在 ASP.NET中的应用。

使用SQL Server LocalDB的优势

快速部署完整的SQL Server。以后项目可以无缝升级到高级版本。 它是真正的SQL Server,直接使用到SQL Server 2012的所有功能。免费,对于初创企业和低配置服务器,可以节约前期的不少运营成本。
缺点与限制

必须对服务器有完全控制权限,租用虚拟主机的用户无法使用(但是目前一个VPS和虚拟主机的价钱差别也不大)。无法通过bin文件夹中放置DLL进行绿色部署,服务器必须安装SQL Server Express LocalDB。

首先我们必须明白怎样管理数据库,在SQL Server 2012管理工具中:

使用 (LocalDb)\v11.0 字符串来连接到当前本机的 LocalDB运行时环境。

.net framework早于4.0.2的情况下,直接使用命名管道来连接 LocalDB,例如:"Server=np:\\.\pipe\LOCALDB#F365A78E\tsql\query"

这一步与我们的开发环境设置关系不大,但是对于将来调试差错,有很大帮助。

下面通过两个步骤设置在ASP.NET中运行LocalDB:

1:解决数据库文件定位

使用连接字符串:connectionString="Data Source=(LocalDb)\v11.0; Initial Catalog=xxx;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\test666.mdf"。

我们把系统生成的数据库文件,在管理工具中附加到SQL Server中,会看到程序自动创建了一个名为DBBases的表

以上几点解决了基本的连接功能,Visual Studio 2012 与SQL Server 2012 Management Studio中调试通过。

但是,问题只解决了一半, 注意上面我用的是“vs2012”、“调试”这两个词语,目前我还没说过在“IIS”中“运行”。

2:IIS中的用户权限问题

在visual studio 中调试项目,使用的是windows 本地用户进程,该进程具有比较高的权限(一般情况下与Administrator无异)。

而要在 IIS 中实际运行项目,执行程序时windows7、2008、2008R2、Server 2012默认都是使用ApplicationPoolIdentity进程。

ApplicationPoolIdentity进程的权限在本篇中不过多解释,在这里你只要把它理解为一个权限非常低的用户进程(IIS_IUSRS组)即可。就算LocalDB是再怎么精简的版本,它毕竟也是SQL Server,在最极端的情况下,需要经历“开启sqlserver.exe进程”、“创建数据库”两个步骤,不是ApplicationPoolIdentity进程(IIS_IUSRS组)想做就做的。

解决办法

1: 应用程序池 – 高级设置 – 标识, 以localsystem账户运行。Localsystem进程等同于本地administrator。

这样的解决办法最简单,直接通过localSystem账户运行进程,一切烦恼瞬间化为乌有。但是随之而来反面因素便是带来了潜在安全威胁: 如果一个不怀善意的客户端上传了一段恶意代码, 那么恶意代码一旦获得运行机会,那么将是以administrator的权限运行于服务器,这将意味着什么,不必多说。

2:通过AttachDBFile,挂接数据库文件到更高的SQL Server版本解决问题。

LocalDB是真正的SQL Server,可以直接和其它版本SQL Server 无缝兼容,我们只需要把数据库文件挂接到Express或更高版本SQL Server中,

仅仅是需要把:“Data Source=(LocalDb)\v11.0;”修改为: “Data Source=.\SQLExpress”,也可以解决一切烦恼了。这样的做法虽然具备实际意义,但是与本文的主题关系不大,在此也不多描述了。

最后,基于安全因素的运行建议

1:直接使用localsystem运行整个程序,只要不允许客户端上传文件,整套程序可以放心运行。但是大多数情况下一个有意义的web程序都是允许客户端上传文件的,所以列举一个上传文件的解决办法:

在用户上传文件时,把文件放置到别的进程空间中,运行时,通过外链(upload.abc.com)文件的办法,达到了让用户文件运行于绝对安全的进程中。

2:与建议1相反,把涉及到数据库操作的代码封装为服务,通过WCF或Web API的自宿主功能,运行在另一个安全进程中(仅限本地连接),面向公众的Web程序通过本地服务接口调用之,如此可以把一切安全因素最小化。(但是开发过程与维护会增加更高的复杂度)

(0)

相关推荐

  • VS2015自带LocalDB数据库用法详解

    对于程序员来说,编程过程中或多或少会和数据库打交道.如果采用Visual Studio进行程序开发,则微软的Sql Server数据库是最好的选择.但是问题来了,Sql Server数据库动辄几个G,安装后占用的空间也相当大,是不是每个开发人员在开发时都需要安装Sql Server呢?其实,对于小型项目.测试型项目.学习型项目的开发,完全没必要使用Sql Server那么高大上的数据库.微软自己也深知这点,因此,推出了Sql Server数据库的超级简化版本:Sql Server LocalDB

  • SQL Server LocalDB 在 ASP.NET中的应用介绍

    我相信世界总是会向更好的方向发展,今年的维也纳新年音乐会没有往年的明星级指挥,但是它通过回归奥地利的本质,以更传统的聚合法则,让过往的艺术家们一代代创造的灿烂,在新的指挥手中,迸发出更深邃的音节.在此,也祝大家新年快乐.如同交响乐一样,构造软件系统不一定必须某个强大的明星驱动,我们站在历代ADO.NET的肩膀上,更好地回归到SQL Server的核心开发:SQL Server LocalDB 在 ASP.NET中的应用. 使用SQL Server LocalDB的优势: 快速部署完整的SQL S

  • SQL Server 2008存储结构之GAM、SGAM介绍

    当我们创建一个数据库的时候,例如以缺省的方式CREATE DATABASE TESTDB,SQLServer自动帮我们创建好如下两个数据库文件. 这两个数据文件是实实在在的操作系统文件,其中一个是叫行数据文件,用来存储数据库的各种对象,另外一个是日志文件,从来记录数据变化的过程. 从逻辑角度而言,数据库的最小存储单位为页即8kb. 数据库被分成若干逻辑页面(每个页面8KB),并且在每个文件中,所有页面都被连续地从0到x编号,其中x是由文件的大小决定的.我们可以通过指定一个数据库ID.一个文件ID

  • Sql Server里删除数据表中重复记录的例子

    [项目] 数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除! [分析] 1.生成一张临时表new_users,表结构与users表一样: 2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录: 3.把users表改为其它的名称,把new_users表改名为users,实现我们的需要. [程序] 复制代

  • 在SQL Server的try...catch语句中获取错误消息代码的的语句

    复制代码 代码如下: BEGIN TRY ... ... END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); RAISER

  • ASP.NET2.0数据库入门之SQL Server

    因为Access并不真正为高性能应用程序服务,所以一个希望有多个同时连接用户的站点必须部署一个比Access更适合的数据源.本文将讲述如何从Microsoft SQL Server(一种企业级RDMS)中获取数据. SQL Server完全版包括了三个部分.第一个是引擎,用于实际组织数据以及针对命令响应进行读取和写入操作.第二个是开发人员的工具软件包,用于对数据库进行操作,例如Query Analyzer和Data Transformation Services.最后一个是用于管理数据的工具,包

  • ASP通过ODBC连接SQL Server 2008数据库的方法

    创建数据库连接文件[dsn文件]的方法 创建 ODBC DSN 文件 在创建数据库脚本之前,必须提供一条使 ADO 定位.标识和与数据库通讯的途径.数据库驱动程序使用 Data Source Name (DSN) 定位和标识特定的 ODBC 兼容数据库,将信息从 Web 应用程序传递给数据库.典型情况下,DSN 包含数据库配置.用户安全性和定位信息,且可以获取 Windows NT 注册表项中或文本文件的表格. 通过 ODBC,您可以选择希望创建的 DSN 的类型:用户.系统或文件.用户和系统

  • Java中调用SQL Server存储过程详解

    本文作者介绍了通过Java如何去调用SQL Server的存储过程,详解了5种不同的存储.详细请看下文 1.使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列.不带参数的 call 转义序列的语法如下所示: 复制代码 代码如下: {call procedure-name} 作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程: 复制代码 代码如下: CREATE PROCEDURE G

  • ASP 连接 SQL SERVER 2008的方法

    虽然网上有很多介绍,但是我还是费了很大的劲才连上.(要安装IIS和SQL SERVER) 新建一个*.asp文件,键入 <% set conn =server.createobject("adodb.connection") conn.open "provider=sqloledb;data source=local;uid=sa;pwd=******;database=database-name" %> 比较标准的 需要注意的是: DataServer

  • C#实现Excel表数据导入Sql Server数据库中的方法

    本文实例讲述了C#实现Excel表数据导入Sql Server数据库中的方法.分享给大家供大家参考,具体如下: Excel表数据导入Sql Server数据库的方法很多,这里只是介绍了其中一种: 1.首先,我们要先在test数据库中新建一个my_test表,该表具有三个字段tid int类型, tname nvarchar类型, tt nvarchar类型 (注意:my_test表中的数据类型必须与Excel中相应字段的类型一致) 2. 我们用SELECT * FROM  OPENROWSET(

  • SQL Server中关于基数估计计算预估行数的一些方法探讨

    关于SQL Server 2014中的基数估计,官方文档Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator里有大量细节介绍,但是全部是英文,估计也没有几个人仔细阅读.那么SQL Server 2014中基数估计的预估行数到底是怎么计算的呢? 有哪一些规律呢?我们下面通过一些例子来初略了解一下,下面测试案例仅供参考,如有不足或肤浅的地方,敬请指教! 下面实验测试的环境主要为SQL Server 201

随机推荐