MSSQL网页设计分析SQL Server2005 SQLCLR代码平安性
优化的SQL查询算法,有效地提高查询速度提纲在SQLServer2005内运转.NET框架代码是一件使人冲动的事变仍是一种威逼?本系列文章将周全切磋这类SQLCLR代码的平安成绩,以便开辟职员和DBA都可以有所自创。1、弁言
编写运转于宿主在任何情况下的CLR中的.NET代码的次要长处之一是代码存取平安(CAS)。
CAS供应了一种基于代码的而不是基于用户的认证形式以防备各类代码的进侵成绩。可是,这类平安形式怎样与SQLServer2005本人的新的加强的平安特性共存呢?默许情形下,你的.NET代码是对照平安的;可是,这两种平安形式很简单产生抵触并且简单给你带来一些成绩。在本篇中,我们将冗长地剖析CAS幕后有关观点和在SQLServer2005中新引进的一些平安特性;然后,在前面的几篇平分析怎样完成在使用SQLServer所供应的初级可编程特性的同时,使这两种体系协同事情。
好动静是,为了完成SQLServer所供应的平安体系和通用言语运转时候库协同事情,微软已供应了必定的工具来完成代码把持。可是,也存在很多风趣的成绩!
可以用C#,VB或任何别的.NET言语编写存储历程及别的代码模块一向被临时等候,而这恰是SQLServer2005最冲动民气的特性之一。开辟职员和DBA终极都可以打破存在于扩大存储历程的Transact-SQL(T-SQL)和C++中的拘束,而用一种真实的具有高度临盆力的言语编写数据库代码!
同时,在数据库服务器的内存空间中运转.NET代码的远景吓坏了某些人,特别是一些卖力回护数据完全性而且确保这些服务器日夜运转的DBA们。运转一些开辟职员的代码(可以完整存取.NET框架和Win32API)的设法招致很多DBA保持以为,对运转于服务器中的如许的代码举行保护基本超越他们的才能以外。
经由过程在集会长进行演讲并举行大批培训举动,和我向同砚和客户发问"是不是在服务器上的.NET代码吓坏了他们及其缘故原由"。终极失掉上面一些典范的备受存眷的成绩:
·含混的平安成绩。个中年夜多半与以后正在呈现的打击成绩相干;可是,明显,对有哪些新内容还不睬解更加存眷。
·必要进修一种全新的妙技来评定是不是代码是平安的。
·在数据和代码之间存在良多的含混性,出格是关于利用.NET代码创立用户界说的范例这类新的才能。
·另有另外一种体例可以完成代码与服务器的"夹杂",只管OLE主动化(SP_OS*)和命令外壳体系(xp_cmdshell)存储历程一向可用来让人们运转内部代码。
现实上,在SQLServer2005中的.NET框架代码,常常被称作是SQLCLR代码,由于它是基于.NET通用言语运转时候库(CLR)。实在,它仅仅是另外一种存在和运转于SQLServer外部的代码模块罢了。它是新器材,并且很酷,可是也仍只是代码;但决不是T-SQL(仍旧是首选的数据存取编码完成体例)的插件取代品;而是,SQLCLR代码为庞大的数据库使用程序创始了全新的大概性。早晚年夜多半的DBA城市利用它而且将不能不做出最初的决意-是不是让它驻于数据库中。
在本文中,我将切磋人们关于SQLCLR代码最体贴的一个成绩之一:其平安性怎样?实践上,我将存心含混两种主要观点-平安性和牢靠性。平安性意味着坚持数据的平安,而牢靠性意味着坚持SQLServer的平安;牢靠性常常被与平安性相搅浑。因而,只管我次要会商平安成绩,可是我还要触及到必定的牢靠性成绩。
我将假定,你熟习在SQLServer2005编写.NET代码的长处和基础常识。归纳综合来讲,包含上面这些内容:
·程序集,作为打包、公布和版本办理的单位
·.NET代码存取平安基本
·SQLServer2005的新的平安特性
换句话说,本文并非一篇有关于SQLCLR代码的进门性文章。
2、平安宿主SQLCLR代码
跟着SQLCLR代码的引进,SQLServer2005如今撑持两种完整分歧的运转时候情况:好的旧的牢靠的T-SQL和新的正在开展中的SQLCLR。在已往的几年中,T-SQL跟着SQLServer版本的不休晋级而不休开展,而且与存储在一个数据库中的数据和工具严密集成到一同,也与SQLServer中的平安体系优秀地集成。比拟之下,SQLCLR代码,在外部利用了一种由CLR所供应的完整分歧的平安体系,这是一种"暖和的"、平安的情况。在此情况下,代码的运转不是基于运转它的用户的平安资历而是基于代码自己的平安资历。同时,SQLCLR代码必需在数据库和服务器的平安局限内实行;但是,这两种平安体系是基本分歧的。现在,微软的SQLSever开辟小组已研讨出一种办法使得这两者共存并可以协同事情。
可以在别的一个使用程序中牢靠地平安地宿主CLR是.NET框架2.0的一种新特性。这类宿主情况及其SQLServer完成,恰是使得这两种平安体系战争共处的"奥密"地点,由于宿主(在此是SQLServer)可以很年夜水平地把持运转的代码。这意味着,从一种平安角度来看,托管SQLCLR代码不被同意存取没有受权给它的数据库工具。该代码必需运转于用户会话的SQLServer平安高低文中,并且必要利用相干的与T-SQL代码不异的允许权来激活它。
注重底线是,在一个数据库中,SQLCLR代码不克不及做比在不异的平安高低文中等价的T-SQL代码模块更多的事变。
当计划如何宿主CLR时,微软具有三个次要的计划方针:
·CLR及运转于个中的代码不克不及让步于SQLServer的平安性和不乱性。
·SQLCLR代码必需遵守SQLServer认证和受权划定规矩。这在必定水平上意味着,它要运转于用户会话的平安高低文中。
·体系办理员必需可以把持对操纵体系资本的存取。这意味着,必需存在一种平安的体例来从SQLServer历程中存取呆板资本。
这些方针的最分明的体现之一是,默许情形下,CLR集成是封闭的。假如你想在一个数据库中运转.NET代码,那末一个体系办理员必需把它翻开。翻开它的T-SQL代码必要利用sp_configure:
sp_configureclrenabled,1
GO
RECONFIGURE
GO
固然,你还可使用新的与SQLServer2005一同安装的SurfaceArea设置工具来完成这一点,如图1所示。从Windows入手下手菜单下,选择"MicrosoftSQLServer2005→ConfigurationTools→SQLServerSurfaceAreaConfiguration",再选择"SurfaceAreaConfigurationforFeatures",然后从列表下选择"CLRIntegration"。
.SurfaceArea设置工具-该图展现了如何利用SurfaceArea设置工具来启动SQLCLR。
因而,准确了解开关CLR集成特性的寄义是非常主要的;但是,它独一影响的是,是不是同意在存储历程、触发器、用户界说范例及用户界说函数中运转SQLCLR代码。假如它被禁用,那末,在该服务器实例中不会实行SQLCLR代码;假如它被启动,那末,任何CLR代码都能够实行(固然,假定用户具有准确的实行权限)。假如它被禁用,它不会制止你把SQLCLR程序集安装到数据库中。你能够安装一切你想利用的程序集(固然,假定你具有如许做的属性允许权),可是它们在任何情况下都不会运转,直到你撑持CLR集成为止。
当SQLCLR代码实行时,它是在一个严厉的平安情况中-这是一个既能回护操纵体系资本又能回护SQLServer中的数据和工具的层。
.平安层:SQLCLR代码并不是运转于一个平安真空中。
显现了这些平安层。操纵体系强迫性利用它本人的把持-利用熟习的用户和组形式以批准存取具有存取把持列表(ACL)的资本。在Windows中运转的每个使用程序都必要运转于一个登录平安的高低文-它具有得当的允许权来举行资本存取。即便SQLServer也必需在这一框架内运作。
经由过程利用它本人的登录机制大概映照到操纵体系的登录机制,SQLServer把持它本人的情况的平安性。在它的情况内,基于由工具的一切者或办理员所付与的允许权,它授与或克制存取数据和工具。T-SQL也在这类权限形式下操纵。SQLCLR代码在不异的平安情况下以T-SQL代码情势实行,并且在由CLR所供应的它本人的平安情况下实行。CLR完成代码存取平安(CAS)以授与它本人的允许权来运转代码。在前面部分,在会商别的一些有关于SQLServer主机情况的平安细节成绩以后,我们将更加深切地剖析一下CAS。
3、SQLServer级的平安性
与初期的SQLServer版原形比,SQLServer2005完成一种更具有粒度性的允许权形式。这类粒度延长到SQLCLR代码内-关于该代码来讲,必要利用三种次要的允许权来安装和运转该代码。
·必要利用CREATEASSEMBLY权限来运转CREATEASSEMBLY语句(这个语句把一个SQLCLR程序集安装到一个数据库中)。
·为了运转代码,一位非体系办理员必需具有在一个代码模块上的EXECUTE权限;而一个sysadmin可以运转任何代码。
·代码的一切者必需具有REFERENCES权限以参考别的工具,比方利用外键和利用形式绑定创立视图(运转位于统一个.NET程序会合的代码不必要这类权限)。
除这些允许权外,引发SQLCLR代码实行的用户在登录时必需对代码参考的数据库表具有一般的SELECT,INSERT,DELETE,或UPDATE允许权。没法完成如许的方针:依据代码对数据库表中的数据所实施的操纵,使得宿主于SQLServer2005内的SQLCLR可以避开这些允许权必要。并且,该权限反省还"钩进"(hookinto)SQLServer2005中的新的实行高低文特性,以便利界说一个SQLCLR存储历程或函数时,你可使用EXECUTEAS语句指定代码的实行高低文。
刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、root帐户设置密码 SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。) 这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。 SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。 其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。 索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。 如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。 sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西 两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
页:
[1]