红俊's profile蝈蝈俊的共享空间PhotosBlogListsMore ![]() | Help |
|
February 27 同时建立主键(PRIMARY KEY)与聚集索引(Clustered Index)的先后顺序主键(PRIMARY KEY)与聚集索引(Clustered Index)的对比可以参看我之前的博客:SQL Server 索引基础知识(4)----主键与聚集索引 一个表最多一个主键,最多一个聚集索引。 数据库在创建主键同时,会自动建立一个唯一索引。如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,则建立主键时候,同时建立一个唯一的聚集索引。 所以建立主键(PRIMARY KEY)与聚集索引(Clustered Index)的先后顺序就只有下面几种情况: 为了更方面的描述,假设我们有如下表: CREATE TABLE [dbo].[User]( [UserName] [nvarchar](10) NOT NULL, [Email] [nvarchar](100) NULL ) ON [PRIMARY] GO
情况一、在没有任何索引的表上建主键,同时自动产生唯一的聚集索引。 这种情况最简单。在表设计中,通过下图方式设置主键,同时不做任何其他修改,就会在建主键的同时,自动建立了唯一的聚集索引。 同时自动建立的主键和聚集索引
情况二、在没有任何索引的表上先建聚集索引,再建主键。 我们如下面2幅图方式创建索引: 这个索引的参数设置如下图: 这个聚集索引创建好后如下: 这时候,我们再按照情况一的方式在表设计中创建主键。 完成后,主建和索引的情况如下图: 显然,这种情况下在创建主键的同时,建立了一个唯一的非聚集索引。 上面演示情况下,显然 PK_User 这个唯一的非聚集索引没有任何存在的价值。
情况三、在有非聚集索引表(即堆)上,先建主键。 情况三和情况四的初始环境都如下,存在一个非聚集索引。
结果如下,类似于情况一,建主键时自动建立一个唯一的聚集索引。 需要注意的是: 没有聚集索引,有非聚集索引的表非聚集索引的行指针会指向数据堆,聚集索引重建时非聚集索引的行指针又会指回聚集索引的行位置。建聚集索引会导致现有的非聚集索引全部重新组织一边。
情况四,在有非聚集索引的表,先建聚集索引,再建主键。 这时候的结果如下图: 类似于情况二。
其他情况: 其他情况都可以归入上述四类。 比如:在一个同时存在聚集索引,非聚集索引的表上建主键,就可以归入情况二。
参考资料: SQL Server 索引基础知识(2)----聚集索引,非聚集索引
如何修改主键 (Visual Database Tools)
February 26 改变 SQL Server Management Studio的模板我前面一篇文章介绍了SQL Server Management Studio的模板。我们可以很方便的通过模板提高我们编写脚本的效率。这篇文章如下: SQL Server的模板 http://blog.joycode.com/ghj/archive/2009/02/16/115466.aspx 但是如果我们修改模板时,是在Template Explorer 中修改模板的, 则Template Explorer 中的模板变了,但是Object Explorer 中的模板没变。 导致这个问题的原因是 Template Explorer 模板的保存目录和 Object Explorer 中模板使用的目录不是一个目录。
以存储过程的模板为例: Template Explorer 中修改新建存储过程模板如下: C:\Users\Administrator\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell\Templates\Sql\Stored Procedure Create Stored Procedure (New Menu).sql 的模板。 Object Explorer 中新建存储过程如下: 这时候新建的存储过程是调用的 C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\SqlWorkbenchProjectItems\Sql\Stored Procedure 目录下的 Create Stored Procedure (New Menu).sql 模板文件。
这两个创建存储过程使用的模板是2个目录下的不同模板。
我们在制作自己规范的模板时,为了更宜用,应该同时更新这两个目录下的模板。
参考资料: Changing SQL Server's Management Studio Stored Procedure Template How to change default right click CREATE NEW STORED PROCEDURE template in SQL Server 2005 February 25 SQL Server 2005 配置发送邮件这个教程是使用SQL Server Management Studio的管理工具完成配置的,其实这个配置也可以通过一系列的SQL语句完成配置。 使用SQL语句完成配置的请参看后面文章:http://www.sqlstudy.com/sql_article.php?id=2008072403 配置前说明: 就像我们其他场景发送邮件一样,我们需要配置SMTP服务器地址,账户, 密码,邮箱等信息。 在SQL Server2005 中,为了避免某个邮件服务器的问题导致无法发送邮件的问题,SQL Server 2005 引入了 mail profile 这个东东。一个 profile 中可以包含多个 account (邮件帐户),这样,SQL Server 发邮件的时候会依次尝试 profile 中的多个邮件帐户,如果发送成功,则退出,否则,利用下一个邮件帐户发送邮件。 我们需要先完成mail profile 的配置,以及数据库邮箱的一些设置,然后发送邮件就只需要一个简单的SQL语句就搞定了。 配置数据库邮箱功能 如下图所示,在SQL Server Management Studio中启动配置数据库邮件。 我们会依次看到下面的步骤: 在如下的步骤,我们来设置数据库Mail。 下面这一步,我们需要给Mail Profile起个名字,之后发送邮件时会用到。 同时在 SMTP accounts 中加入可用的发送邮件服务器以及帐号,密码 点击 add 可以看到下面的图 根据你的情况,增加发送的帐号。至少一个。 完成邮件帐号配置后,继续下去则是如下图: Private Profiles 部分的信息如下: 这里是邮件的一些限制设置
这一步是要让我们确认一下我们的设置 点击完成,系统将完成数据库邮件的设置
完成上述步骤,我们就设置好了数据库邮件。 发送邮件的测试 我们可以通过下面地址,发送封测试邮件 就会出现下面的发送测试邮件的窗口,输入要接收者的邮箱地址,点击发送测试邮件,测试邮件就发送出去了。 这时候,SQL 方式发送测试邮件则是如下的SQL 语句 exec msdb..sp_send_dbmail @profile_name = '报表通知邮件配置' -- profile 名称 ,@recipients = 'ghj1976@csdn.net' -- 收件人邮箱 ,@subject = 'SQL Server 2005 Mail Test' -- 邮件标题 ,@body = 'Hello Mail!' -- 邮件内容 ,@body_format = 'TEXT' -- 邮件格式
参考资料: 在 SQL Server 2005/2008 中,使用 Gmail 帐号配置数据库邮件功能
February 24 SQL Server 生成脚本的一些参数说明我们通过下面菜单,就可以在SQL Server Management Studio中,把我们选择的数据库中每一个对象都产生脚本。这对我们做数据库的版本管理,数据库的升级文档都很方便。 在生成脚本过程中,有很多参数可以选择,合理的配置这些参数,可以让我们很方便的按照我们的期望生成脚本。 生成脚本的一些选项,如下图: 我这里是SQL 2005 的选项, SQL 2008 的选项跟这个稍有差异。 这个差异可以参看下面两篇文章 SQL Server 2005 的生成 SQL Server 脚本向导(“选择脚本选项”页) 参数说明,其中红色部分是我比较常用的。 常规选项部分: Ansi Padding Append to File Continue Scripting on Error Convert UDDTs to Base Types Generate Script for Dependent Objects Include Descriptive Headers 此项我生成时习惯修改为true,这样可以看到注释 Include If NOT EXISTS Include system constraint names Script Collation 参看 http://technet.microsoft.com/zh-cn/library/ms187582(SQL.90).aspx Script Create Script Defaults Script Drop Script Extended Properties Script for Server Version Script Logins Script Object-Level Permissions Script Owner 如果 true, 比如存储过程名字就可能是 dbo.*** 如果 false,则没有dbo.这个信息。我习惯于false。 Script Statistics Script USE DATABASE Script VarDecimal Options 表和视图部分 Script Check Constraints Script Foreign Keys Script Full-Text Indexes Script Indexes Script Primary Keys Script Triggers Script Unique Keys
其他的一些选项大家都很熟悉,就是让我们选择那些数据库对象要生成。忽略不计。
在生成何种格式时,SQL Server 很方便的给我们提供了一些选项,如下: 这里可以方便的选择以 Unicode 或“ANSI 文本”格式将脚本生成到 .sql 文件中。 而且可以所有脚本在一个文件,也可以每个对象的脚本在一个自己的文件。 再后面就是确认生成选项,然后就生成了。
参考资料: 生成 SQL Server 脚本向导的 F1 帮助 How to: Generate a Script (SQL Server Management Studio) How can I automate the “generate scripts” task in SQL Server Management Studio 2008 ? Microsoft SQL Server Database Publishing Wizard 1.1 February 16 SQL Server的模板我们在编写SQL 脚本的时候,有很多通用的地方,这时候模板就可以给我们带来很大的方便。下面就用新建存储过程为例,来说明使用模板的好处,以及如何维护这个模板。 以下提到的特点适用于 SQL Server 2005 和 SQL Server 2008。
模板的好处: 我们在 SQL Server 中,新建一个存储过程,如下方式: 默认情况下,这样我们就会获得一个如下的SQL语句 -- ================================================ -- Template generated from Template Explorer using: -- Create Procedure (New Menu).SQL -- -- Use the Specify Values for Template Parameters -- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in -- the definition of the procedure. -- ================================================ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> -- Add the parameters for the stored procedure here <@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, <@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0> AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2> END GO 我们就可以在这个现有的模板基础上书写出我们自己的存储过程。 当然,模板中需要修改的内容我们可以通过更方便的方式就行修改。如下图方式或者输入快捷键 Ctrl+Shift+M 。
在 SQL Server Management Studio 中, 点击如下菜单项 Query--> Specify Values for Templete Parameters 。就会出现下面的模板参数值指定窗体: 我们在这个窗体就可以输入我们需要修改的内容。 然后我们就可以很方便的产生我们需要的存储过程了。
如果让这个模板跟我们的一些经验相捆绑,也就是我们自己维护自己的一些模板呢?下面就使方法: 如何配置模板? 在 SQL Server Management Studio 中, 点击如下菜单项 View --> Templete Explorer 。 这样在 SQL Server Management Studio 的右边就会出现 Templete Explorer ,如下图。 在这里我们就可以很方便的维护自己的模板。
前面的例子中我们看到了,模板中有些参数我们可以指定。如何使用这些参数呢? 模板参数的要求
参数需要三个元素:要替换的参数的名称、该参数的数据类型以及该参数的默认值。 参数按以下格式包括在尖括号 (< >) 中:<parameter_name, data_type, default_value>。 parameter_name 列出存储过程或函数中的参数。此字段是只读的。 data_type 模板中参数的数据类型。此字段是只读的。若要更改数据类型,请更改模板中的参数。 default_value 为所选参数指定值。默认值。
参考资料: SQL Server 2005创建自定义模板
创建自定义模板
关于SQL SERVER中的模板问题
February 11 虚机搭配NLB负载平衡时碰到"没有接口可用于安装新的群集"的解决方案最近在学习负载平衡(NLB),本地用虚机搭配起一个负载平衡的环境。但是在加第二台服务器的时候,一直加不上去,报如下错误:“没有接口可用于安装新的群集”。如下图:
解决方法: 在设备管理器中,删除原先的网卡。重新安装一边,就可以了。 原因分析 : 使用虚机作试验时,我们会克隆虚拟机。 克隆的虚拟机,虽然在开机的时候会提示创建一个新的MAC地址,以确保2台机子MAC地址不一样。但是还是有些东西是一样的。 我们卸载网卡再重新安装,就可以解决这个问题。
参考资料: 利用NLB实现单网卡高性能终端服务器 在线等!!NLB群集问题 Windows Server 2003实现网络负载均衡(NLB) |
|
|