41071.htm

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

HTM
322
字号
<P>针对每个开发者的数据库.NET Framework基础结构有一些限制。它包含了当使用Visual Studio调试器来跟踪代码时的执行过程是CLR引擎的单一的线程,除了最后的报表,调试决不可能取代生产系统。 </P>
<P>经验丰富的程序员推荐使用SQL Server 2005开发者版本,因为它为程序员们提供了Management Studio,它的资源控制API是绝对完整的。这个版本也包含了SQL Server Profiler,这样做是为了适应了SQL Server的需要。这个版本里还包含了在脚本和自动控制方面大量的工具, 由于数据库管理员和开发者的角色有重叠, 这样做就可以使开发者在创建和调试数据库对象例如SQLCMD时更加多产。想知道更多关于工具的信息,请登陆白皮书结束部分所列出的资源及网站链接。</P>
<P>#p#</P>
<P><STRONG>目录对象</STRONG></P>
<P>一个好的数据库管理员的主要任务就是跟踪服务器上的对象,例如那些表在哪些数据库中,哪些存储过程和函数是被要求的,哪些脚本每日,每周,每月一定要运行等等。为了帮助针对所有这些对象的跟踪,我们有很多的工具,他们有来自Microsoft的也有其他的软件生产厂商的,这其中就包括针对数据模型的Microsoft&reg; Visio&reg;和针对数据库的Microsoft SQL Server Management Studio 等等。 </P>
<P>面对外部世界SQL Server 2005的整合功能引入了很多新的对象来对相关系统目录的早期版本进行补充和扩展。这部分文字介绍了如何利用改变的编录去获得这些新数据库对象的正确列表,以及数据库中每个新数据库对象类型附加的新的源数据。</P>
<P><STRONG>程序集</STRONG> </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>-- SYS.ASSEMBLIES<BR>-- Name, Assembly ID, security and “is_visible” flag<BR>SELECT * FROM sys.assemblies</P><P>-- SYS.ASSEMBLY_FILES<BR>-- Assembly ID, name of each file &amp; assembly contents<BR>SELECT * FROM sys.assembly_files</P><P>-- SYS.ASSEMBLY_MODULES<BR>-- Sql ObjectID, Assembly ID, name &amp; assembly method<BR>SELECT * FROM sys.assembly_modules</P><P>-- SYS.ASSEMBLY_REFERENCES<BR>-- Links between assemblies on Assembly ID<BR>SELECT * FROM sys.assembly_references</P><P>-- SYS.MODULE_ASSEMBLY_USAGES<BR>-- Partial duplicate of SYS.ASSEMBLY_MODULES<BR>-- Links SQL Object ID to an Assembly ID<BR>SELECT * FROM sys.module_assembly_usages</P></PRE></TD></TR></TBODY></TABLE></P>
<P>这些视图被定义为系统目录视图为这些新的程序集的容器提供信息。这些程序集(或者.dll文件)是数据库中.NET Framework 程序编辑和注册的结果。</P>
<P>sys.assemblies 的“is visible”标记可以在使用公共方法注册时隐藏程序集。它可以隐藏例如利用网络服务访问数据时.XmlSerializers产生的帮助程序集。</P>
<P>在sys.assembly_modules视图中,一个空程序集方法显示了一个被用于用户定义聚合的程序集。需要注意的是有两个系统存储过程对这些表提供访问。如下图。</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>EXEC sys.sp_assemblies_rowset N'&lt;AssemblyName&gt;'<BR>EXEC sys.sp_assembly_dependencies_rowset &lt;AssemblyID&gt;</P></PRE></TD></TR></TBODY></TABLE></P>
<P><STRONG>存储过程</STRONG></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>-- Read CLR Stored Procedure Metadata<BR>SELECT schema_name(sp.schema_id) + '.' + sp.[name] AS [Name]<BR>&nbsp;, sp.create_date<BR>&nbsp;, sp.modify_date<BR>&nbsp;, sa.permission_set_desc AS [Access]<BR>&nbsp;, sp.is_auto_executed<BR>FROM sys.procedures AS sp<BR>&nbsp;INNER JOIN sys.module_assembly_usages AS sau<BR>&nbsp;&nbsp;ON sp.object_id = sau.object_id<BR>&nbsp;INNER JOIN sys.assemblies AS sa<BR>&nbsp;&nbsp;ON sau.assembly_id = sa.assembly_id<BR>WHERE sp.type_desc = N'CLR_STORED_PROCEDURE'</P></PRE></TD></TR></TBODY></TABLE></P>
<P><STRONG>触发器</STRONG></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>-- CLR Trigger Metadata<BR>-- Note that Trigger parent object is always in the same schema<BR>SELECT schema_name(so.schema_id) + '.' + tr.[name] AS [Name]<BR>&nbsp;, schema_name(so.schema_id) + '.' + object_name(tr.parent_id) AS &nbsp;&nbsp;&nbsp;[Parent]<BR>&nbsp;, te.type_desc AS [Fired On]<BR>&nbsp;, te.is_first<BR>&nbsp;, te.is_last<BR>&nbsp;, tr.create_date<BR>&nbsp;, tr.modify_date<BR>&nbsp;, sa.permission_set_desc AS [Access]<BR>&nbsp;, tr.is_disabled<BR>&nbsp;, tr.is_not_for_replication<BR>&nbsp;, tr.is_instead_of_trigger <BR>FROM sys.triggers AS tr<BR>&nbsp;INNER JOIN sys.objects AS so<BR>&nbsp;&nbsp;ON tr.[object_id] = so.[object_id]<BR>&nbsp;INNER JOIN sys.trigger_events AS te<BR>&nbsp;&nbsp;ON tr.[object_id] = te.[object_id]<BR>&nbsp;INNER JOIN sys.module_assembly_usages AS mau<BR>&nbsp;&nbsp;ON tr.object_id = mau.object_id<BR>&nbsp;INNER JOIN sys.assemblies AS sa<BR>&nbsp;&nbsp;ON mau.assembly_id = sa.assembly_id<BR>WHERE tr.type_desc = N'CLR_TRIGGER'</P></PRE></TD></TR></TBODY></TABLE></P>
<P><STRONG>用户定义函数</STRONG></P>
<P><STRONG>标量函数</STRONG></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>-- List CLR Scalar Functions<BR>SELECT schema_name(so.schema_id) + N'.' + so.[name] AS [Name]<BR>&nbsp;, so.create_date, so.modify_date<BR>&nbsp;, sa.permission_set_desc AS [Access]<BR>FROM sys.objects AS so<BR>&nbsp;INNER JOIN sys.module_assembly_usages AS sau<BR>&nbsp;&nbsp;ON so.object_id = sau.object_id<BR>&nbsp;INNER JOIN sys.assemblies AS sa<BR>&nbsp;&nbsp;ON sau.assembly_id = sa.assembly_id<BR>WHERE so.type_desc = N'CLR_SCALAR_FUNCTION'</P></PRE></TD></TR></TBODY></TABLE></P>
<P><STRONG>表值函数</STRONG></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>-- List CLR Table Functions<BR>SELECT schema_name(so.schema_id) + N'.' + so.[name] AS [Name]<BR>&nbsp;, so.create_date, so.modify_date<BR>&nbsp;, sa.permission_set_desc AS [Access]<BR>FROM sys.objects AS so<BR>&nbsp;INNER JOIN sys.module_assembly_usages AS sau<BR>&nbsp;&nbsp;ON so.object_id = sau.object_id<BR>&nbsp;INNER JOIN sys.assemblies AS sa<BR>&nbsp;&nbsp;ON sau.assembly_id = sa.assembly_id<BR>WHERE so.type_desc = N'CLR_TABLE_VALUED_FUNCTION'</P></PRE></TD></TR></TBODY></TABLE></P>
<P><STRONG>用户定义聚合</STRONG></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>-- List CLR Aggregate Functions<BR>SELECT schema_name(so.schema_id) + N'.' + so.[name] AS [Name]<BR>&nbsp;, so.create_date<BR>&nbsp;, so.modify_date<BR>&nbsp;, sa.permission_set_desc AS [Access]<BR>FROM sys.objects AS so<BR>&nbsp;INNER JOIN sys.module_assembly_usages AS mau<BR>&nbsp;&nbsp;ON so.object_id = mau.object_id<BR>&nbsp;INNER JOIN sys.assemblies AS sa<BR>&nbsp;&nbsp;ON mau.assembly_id = sa.assembly_id<BR>WHERE so.type_desc = N'AGGREGATE_FUNCTION'</P></PRE></TD></TR></TBODY></TABLE></P>
<P>#p#</P>
<P><STRONG>用户定义类型</STRONG></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>-- User Defined Type Metadata<BR>-- Includes base assembly information<BR>SELECT st.[name] AS [Type Name]<BR>&nbsp;, st.max_length<BR>&nbsp;, st.[precision]<BR>&nbsp;, st.scale<BR>&nbsp;, st.collation_name<BR>&nbsp;, st.is_nullable<BR>&nbsp;, sa.create_date<BR>&nbsp;, sa.[name] AS [Assembly Name]<BR>&nbsp;, sa.permission_set_desc AS [Access]<BR>FROM sys.types AS st<BR>&nbsp;INNER JOIN sys.type_assembly_usages AS tau<BR>&nbsp;&nbsp;ON st.user_type_id = tau.user_type_id<BR>&nbsp;INNER JOIN sys.assemblies AS sa<BR>&nbsp;&nbsp;ON tau.assembly_id = sa.assembly_id</P></PRE></TD></TR></TBODY></TABLE></P>
<P><STRONG>安全维护</STRONG></P>
<P>在整合环境的独特安全模式下存在一个潜在的缺点,因为设计上的缺陷使得一方可能危及另一方的安全。例如,一个扩展存储过程必须回连到SQL Server 去访问数据并且必须支持活动的事务去保护修改数据的完整性。任何的数据失败都会导致安全漏洞。</P>
<P>数据库引擎.NET Framework 设计API的架构在安全模式方面是非常注意的。SQL Server 在.NET Framework 代码访问安全方面使用GRANT命令来提供针对特殊对象访问,并且控制在高/低权限模式之间的交互。</P>
<P>一个非管理用户在他们能被使用之前必须获得对日常事务处理的执行权限。</P>
<P>单一化处理代码访问安全模块(定义程序集允许做的事情)。组的权限分为下面三个设置:</P>
<P><STRONG>SAFE<BR></STRONG>程序集方法只能和Transact-SQL的存储过程或函数同级别。代码要运行在信任调用下。</P>
<P><STRONG>EXTERNAL ACCESS<BR></STRONG>程序集方法可以执行文件和网络的输入/输出。外部代码使用SQL Server 服务帐号权限运行,这样的设置可以在控制用户输入的特定外部资源时确定调用者的权限。</P>

⌨️ 快捷键说明

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