41071.htm

来自「一本很基础的SQL讲解」· HTM 代码 · 共 322 行 · 第 1/5 页

HTM
322
字号
<P><STRONG>UNSAFE</STRONG><BR>这个权限延展了外部权限的设置,使得程序集允许不可管理的调用,代码不可控。</P>
<P>注意在UNSAFE模式下,整合代码将阻止一部分对.NET Framework 的库使用。例如,编译器,windows 管理器,企业服务器,和其他一些由于SQL Server 无法发现而被阻止掉的功能。</P>
<P>我们推荐数据库管理员限制External/Unsafe模式的使用,如果开发者要求这些高级别的权限时管理员应该去选择更加严格的环境要求。</P>
<P><STRONG>源代码管理</STRONG></P>
<P>CREATE ASSEMBLY在SQL Server 数据库中加载二进制程序集,但没有办法同时加载程序源。因为他是为了数据库管理员创建程序集来管理源代码用的。就好像第三方软件只支持二进制代码,也可以为他们的软件提供专业的技术支持。无论如何,在你的代码发生问题之前让你的数据库管理员可以管理源代码是一件非常重要的事情。</P>
<P>在这篇文章的设计范例部分包括推荐的为应用程序开发者提供的工具。根据这些推荐的内容,数据库管理员对于改变控制策略,程序,以及对开发/测试系统和那些正在运行程序的系统的正确描述这些方面会变的非常的容易,使用SQL Server 2005新的安全特性和DDL触发器可以在生产环境中限制访问和支配(至少是审核)来更好的执行控制策略。如果希望,DDL触发器可以阻止一个数据库中所有的DDL(数据定义语言)声明,或者特殊的某个或者某组声明。</P>
<P>注意没有经过完全的检查的代码是不会从开发阶段送到生产阶段的,我们一定要确保代码万无一失。</P>
<P>尽管如此,我们依然推荐开发者执行Visual Studio的自动部署特性利用最大的生产压力在代码开发周期中来进行测试,在完成后开发者应该将源代码和编译文件传给负责部署的数据库管理员 。</P>
<P>需要注意的是因为.NET Framework的编译器是免费的,所以数据库管理员 没有必要安装Visual Studio 除非他们想利用Visual Studio 中的一些特性来对代码进行检查和调试的处理。</P>
<P>数据库管理员 应该将源文件做好备份,然后将检查后的代码和编译后的文件保存在另外的一个位置,这样可以对代码作一个很好的保护。</P>
<P>我们同样建议副本应该在每台它加载程序集的数据库上进行关联。这意味着在开发代码目录上和多个数据库管理员 目录上执行的是单一副本。如下图,在数据库利用CREATE ASSEMBLY命令加载了程序集后所有的支持文件例如源代码,文档都通过ALTER ASSEMBLY命令加载。</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>ALTER ASSEMBLY LeastSquaresSqlFunction <BR>ADD FILE FROM 'D:\Production System\Source Code\Least Squares\LS1.cs';</P></PRE></TD></TR></TBODY></TABLE></P>
<P>◆Productivity Tip<BR>注意 ALTER ASSEMBLY命令支持在单一语句中加载多个文件。<BR>◆数据库管理员 和开发者都应该在检查完代码后作出一个审核日值改变的注释。<BR>◆WinDiff 工具(或者 Visual SourceSafe Compare) 是一个很好的代码比较的工具,详细信息请查阅:WinDiffhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/tools/tools/windiff.asp. <BR>◆Productivity Tip</P>
<P>当Visual Studio 使用SQL Server Database Engine .NET Framework 编程 API 编译应用程序时,编译输出面板包括所需的编译器命令行工具。他可以被减切并且复制到一个发布命令文件,数据库管理员可以用它重新编译应用程序。</P>
<P><STRONG>Release 管理</STRONG></P>
<P>在源代码在专业的控制保护下,开发者提交了源文件和编译文件。这时release管理器在代码和架构配置不当的情况下就有了很大的作用。如果希望了解它为什么如此重要,可以关注这篇文章下面有关SQL Server 2005 的部分。</P>
<P>SQL Server 2005 的工具设置使得数据库管理员 和开发者可以在一个公用源代码库上协同工作。Microsoft SQL Server Management Studio 可以从Microsoft Visual SourceSafe或者其他地方加载和保存源控制应用的脚本。</P>
<P><A href="/files/uploadimg/20070227/1816174.jpg" target=_blank><IMG height=186 alt="" src="/files/uploadimg/20070227/1816174.jpg" width=450 border=0></A></P>
<P><STRONG>图 5</STRONG></P>
<P>数据库管理员对开发源代码项目有读权限,这样他可以拷贝特定的系统上释放的项目的脚本和源代码。释放管理的另一个选项就是提取适当的源代码的版本并把他们放到一个数据库管理员 可以访问的文件夹里。使他们可以在共享SQL Server 上重新编译和加载。</P>
<P>#p#</P>
<P>控制代码提升也是数据库管理员的一个关键角色。允许开发者直接在共享系统上部署,那么它所导致的最终在生产环境中部署产生的不可控源代码和错误几乎是不可避免的。当建立了一个错误版本的源代码或者创建了一个从未测试过的代码时都会马上要求重编译。最终测试环境中不能再有问题出现,因为在资源不能匹配的时候产品程序集是不能做调试的。</P>
<P>下面的例子例举了 Microsoft&reg; C# 程序编译器 csc.exe (.NET Framework 中的C# 编译器).</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>Csc.exe /noconfig /nowarn:"1701;1702" /warn:4 /define:DEBUG;</P><P>  TRACE /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50215\System.Data.dll </P><P>  /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50215\System.dll </P><P>  /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50215\System.Web.Services.dll </P><P>  /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50215\System.XML.dll /debug+ </P><P>  /optimize- /out:obj\Release\MainframeWebService.dll </P><P>  /target:library IBMSystemCode.cs AssemblyInfo.cs "Web References</P><P>  \com.Mainframe.webservices\Reference.cs"</P></PRE></TD></TR></TBODY></TABLE></P>
<P>这是一个调用web服务的例子,下面的阶段要求连续的代码,这将在下面的例子中提到。这个程序是安装在.NET Framework 2.0 SDK 下,可以在C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin找到。在SQL Server 2005 中使用CREATE ASSEMBLY命令或者用户界面注册一个创建的程序集“MainframeWebService.XmlSerializers.dll”<BR>Sgen.exe /n /f MainframeWebService.dll</P>
<P>使用Transact-SQL 注册程序集。</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>CREATE ASSEMBLY [MainframeWebService]<BR>&nbsp; AUTHORIZATION dbo<BR>FROM 'C:\MWS\bin\Release\MainframeWebService.dll'<BR>&nbsp; WITH permission_set = external access<BR>go<BR>CREATE ASSEMBLY [MainframeWebService.XmlSerializers]<BR>&nbsp; AUTHORIZATION dbo<BR>FROM 'C:\MWS\bin\Release\MainframeWebService.xmlserializers.dll'<BR>&nbsp; WITH permission_set = safe<BR>go</P></PRE></TD></TR></TBODY></TABLE></P>
<P>上面的代码完成了对开发代码的编译,产生了编译代码,然后通过CREATE FUNCTION/PROCEDURE加载了程序集到SQL Server 2005<BR>&nbsp;<BR>◆<STRONG>Productivity Tip</STRONG><BR>产生的代码会在它的父程序集之后加载。在stealth模式下是相反的,并且父程序集自动加载。要求使用CREATE语句并用ALTER ASSEMBLY … WITH VISIBILITY = ON解锁它。</P>
<P>使用专业工具可以让开发者达到最大的生产力。数据库部署环境也能够被转移到一个好的生产实例上,同时做到控制代码保护。数据库管理员 可以通过配置CLR技术而不会有系统稳定性方面的风险。</P>
<P><STRONG>性能检测</STRONG> </P>
<P>如果数据库管理员 安装了SQL Server 2005 ,然后开启了Windows System Monitor (PERFMON.EXE),它可能会失望的看到只有一个SQL Server CLR counter (SqlServer:CLR “CLR Execution”)给出了CPU的统计报告。</P>
<P><A href="/files/uploadimg/20070227/1816175.jpg" target=_blank><IMG height=294 alt="" src="/files/uploadimg/20070227/1816175.jpg" width=450 border=0></A>&nbsp;</P>
<P><STRONG>图 6</STRONG></P>
<P>然而这是一个误导,因为在.NET CLR计算器组中存在着大量的计数器。他们在性能列表里面。他们可以根据SQL Server 服务的名字来做筛选。</P>
<P>◆<STRONG>Productivity Tip</STRONG><BR>.一个服务器运行多个SQL Server 实例处理的时候,每个CLR代码在列表中都不显著,这时,应该将某一个实例连接到CLR,然后通过CPU的活动型来判别。</P>
<P>计数器有很多的设置帮助我们了解程序在SQL上运行时的健康性和活动型。</P>
<P>◆.NET CLR Exceptions –Exceptions/Sec 提供了一个对应用程序代码的早期警告,如果这个值比平时高(这个设置也可以用在正常的功能上),应用程序可能会失败。更深入的报告要去看错误日志。<BR>◆.NET CLR Loading – SQL Server 使用AppDomain在数据库之间隔离代码。一个CLR 为程序提供了一个独立运行时。这个设置可以检测AppDomains和系统上加载的程序集的数量。这个值太大意味着“procedure cache”的压力过大。<BR>◆.NET CLR Memory –提供了三种CLR内存的详细信息。这个计数器还可以检测CLR内存的使用情况,可以设置警告值。提示代码的问题,从而使代码使用较低的内存重新设计。</P>
<P>#p#</P>
<P>.NET Data Provider for SQL Server –提供了每秒的连接数和非连接数,在获取数据库级别的活动性方面非常有用。如下图这个计数器是数据库级别的。</P>
<P><A href="/files/uploadimg/20070227/1816176.jpg" target=_blank><IMG height=258 alt="" src="/files/uploadimg/20070227/1816176.jpg" width=450 border=0></A>&nbsp;&nbsp;</P>
<P>除了服务监控计数器,我们在SQL Server Dynamic Management Views (DMV)中也可以得到大量SQL Server操作系统的数据的信息。下面是一些有用的查询。</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>-- Loaded Assemblies (run in each database)<BR>SELECT sa.[name]<BR>&nbsp;, ad.[appdomain_name]<BR>&nbsp;, clr.[load_time]<BR>FROM sys.dm_clr_loaded_assemblies AS clr<BR>&nbsp;INNER JOIN sys.assemblies AS sa<BR>&nbsp;&nbsp;ON clr.assembly_id = sa.assembly_id<BR>&nbsp;INNER JOIN sys.dm_clr_appdomains AS ad<BR>&nbsp;&nbsp;ON clr.appdomain_address = ad.appdomain_address</P><P>-- SQL CLR Memory Usage<BR>SELECT mo.[type]<BR>&nbsp;, sum(mo.pages_allocated_count * mo.page_size_in_bytes/1024) <BR>&nbsp;&nbsp;AS N'Current KB'<BR>&nbsp;, sum(mo.max_pages_allocated_count * mo.page_size_in_bytes/1024) <BR>&nbsp;&nbsp;AS N'Max KB'<BR>FROM sys.dm_os_memory_objects AS mo<BR>WHERE mo.[type] LIKE '%clr%'<BR>GROUP BY mo.[type]<BR>ORDER BY mo.[type]</P><P>-- SQL CLR Wait Statistics<BR>SELECT ws.* <BR>FROM sys.dm_os_wait_stats AS ws<BR>WHERE ws.wait_type LIKE '%clr%'</P><P>-- Requests that are currently in SQL CLR<BR>SELECT session_id, request_id, start_time, status, command, database_id,<BR>wait_type, wait_time, last_wait_type, wait_resource, cpu_time, <BR>total_elapsed_time, nest_level, executing_managed_code<BR>FROM sys.dm_exec_requests<BR>WHERE executing_managed_code = 1</P><P>-- Query performance and time spent in SQL CLR.<BR>SELECT <BR>(SELECT text FROM sys.dm_exec_sql_text(qs.sql_handle)) AS query_text, qs.*<BR>FROM sys.dm_exec_query_stats AS qs<BR>WHERE qs.total_clr_time &gt; 0 <BR>ORDER BY qs.total_clr_time desc</P><P>-- Obtaining CLR Execution performance counter values.<BR>SELECT object_name, counter_name, cntr_value, cntr_type<BR>FROM sys.dm_os_performance_counters<BR>WHERE counter_name LIKE '%CLR%'</P></PRE></TD></TR></TBODY></TABLE></P>
<P><STRONG>调试代码</STRONG></P>
<P>SQL Server 2005 和Visual Studio 2005 是紧密整合的。 The SQL Server 的工具以及商业智能部分是为数据库管理员设计的,而Visual Studio 的整合开发环境是为专业开发人员设计的。</P>
<P>调试处理针对数据库管理员和开发人员的功能分割是不同的:</P>
<P>◆数据库管理员 使用SQL Server Profiler测试跟踪数据库的活动性。</P>
<P><A href="/files/uploadimg/20070227/1816177.jpg" target=_blank><IMG height=252 alt="" src="/files/uploadimg/20070227/1816177.jpg" width=450 border=0></A>&nbsp;</P>
<P><STRONG>图 8</STRONG></P>
<P>◆开发人员使用Visual Studio debugger去跟踪代码执行,在他们自己的SQL Server (开发版)上使用SQL Server Profiler检测数据库的活动性。Debugger可以执行客户端到服务器的端对端的调试。这种模式使得开发过程中的调试变得非常具有生产时效性。</P>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?