2013年8月 的存档
2013八月29

存储过程使用场合

设计好的思路 评论关闭

使用存储过程的前提:
1,没有移植的问题,比如做的是一产品,客户要求不同的数据库,这时将逻辑放到存储过程上就不好移值,放到代码中则好很多。
2,项目规模比较小,如几千人使用的企业级系统,很少考虑复杂的分库分表分服务器

最佳策略:尽量不用存储过程

在规模小时,如几千人使用的企业级系统:
方案:
对于简单的查询,尽量不用存储过程,联合表可用视图,这样做的好处有二:
1,用视图分页的话可以通过底层框架生成通用的分页,而用存储过程需要对每个sql写rownumer之类
2,用视图页面可通过代码生成工具很容易直接生成,开发效率高。
对于复杂的查询或者事务更新可以使用存储过程,一是利用存储过程预编译的特点提高效率,并且逻辑都在数据库里,避免了多次查询。二是更改逻辑比较方便,不用打开项目,修改再部署,并且动到了bin的话,还会引起系统重新编译。(当然第二种好处适合小项目,对稳定性要求不高,不会因改错了一个逻辑,耽搁5分钟就会有大量投诉。)

参考:大型系统必须得要存储过程和触发器吗?

2013八月29

隐藏数据库

sql server 评论关闭
USE MASTER
GO
GRANT VIEW ANY DATABASE TO PUBLIC; -- turn this back on if it was off
GO
DENY VIEW ANY DATABASE TO USER_A;
GO

How to hide SQL Server user databases in SQL Server Management Studio

2013八月25

关于Redis的常识

ASP.NET 评论关闭
2013八月24

给 C# 开发者的代码审查清单

ASP.NET 评论关闭

给 C# 开发者的代码审查清单

可参考:

1. 确保没有任何警告(warnings)。
2.如果先执行Code Analysis(启用所有Microsoft Rules)再消除所有警告就更好了。
3. 去掉所有没有用到的usings。编码过程中去掉多余代码是个好习惯。
4. 在合理的地方检查对象是否为’null’,避免运行的时候出现Null Reference Exception
5,代码可重用性:如果一块代码已经被使用超过一次,或者你希望将来使用它,请提取成一个方法。将重复的工作做成通用的方法放在相关的类中。
6,确保代码中方法的行数不要过多,不超过30到40行。
7,单元测试

清单

1. 确保没有任何警告(warnings)。

2.如果先执行Code Analysis(启用所有Microsoft Rules)再消除所有警告就更好了。

3. 去掉所有没有用到的usings。编码过程中去掉多余代码是个好习惯。(参考:msdn

4. 在合理的地方检查对象是否为’null’,避免运行的时候出现Null Reference Exception

5. 始终遵循命名规范。一般而言变量参数使用驼峰命名法,方法名和类名使用Pascal命名法。(参考:msdn

6. 请确保你了解SOLID原则。

根据维基百科定义:在程序设计领域,SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能。SOLID所包含的原则是通过引发编程者进行软件源代码的代码重构进行软件的代码异味清扫,从而使得软件清晰可读以及可扩展时可以应用的指南。SOLID被典型的应用在测试驱动开发上,并且是敏捷开发以及自适应软件开发的基本原则的重要组成部分。参考:wiki/SOLID_(面向对象设计)

7. 代码可重用性:如果一块代码已经被使用超过一次,或者你希望将来使用它,请提取成一个方法。将重复的工作做成通用的方法放在相关的类中,这样一旦你完成别人就可以使用了。将常用功能开发成用户控件,这样可以跨项目重用它们。(参考: 、 

8. 代码一致性:比方说,Int32写成int,String写成string,应该在代码里保持统一形式。不能一会二写成int一会儿写成Int32。

9. 代码可读性:代码应该是可维护的,便于其他开发者理解。(参考:msdn

10. 释放非托管资源,比如文件I/O,网络资源等。一旦使用结束就应该释放它们。如果你想一旦超出使用范围就自动释放对象,可以使用usings将非托管代码括起来。参考:msdn

11. 合理实现异常处理(try/catch和finally块)和异常记录。参考:msdn

12. 确保代码中方法的行数不要过多,不超过30到40行。

13. 及时用代码管理工具check-in/check-out代码。(比如TFS) 参考:codeproject.com

14. 相互审查代码:和你的同事交换代码,实现内部审查。

15. 单元测试:编写开发测试用例完成单元测试,确保代码被送到QA以前,基本测试完成。参考:msdn

16. 尽量避免for/foreach循环嵌套和if条件嵌套。

17. 如果代码只会使用一次,请使用匿名类型。参考:msdn

18. 尽量使用LINQ查询和Lambda表达式,增加可读性。参考:msdn

19. 合理使用var、object和dynamic关键字。由于很多开发者会感到困惑或者知道的很少,会觉得它们有些相似,故而交换使用,这是要避免的。参考:blogs.msdn

20. 使用访问限定符(private, public, protected, internal, protected internal)限定每个方法、类或变量的需要范围。比方说如果一个类只会在程序集内使用,那么定义成internal就足够了。参考:msdn

21. 在需要保持解耦的地方使用接口,有些设计模式的出现也是由于接口的使用。参考:msdn

22. 按照用法和需要将类定义为sealed、static或abstract。参考:msdn

23. 如果需要多次串联,请使用Stringbuilder代替string,这可以节省堆内存。

24. 检查是否有不可能执行的代码,如果有,请修改。

25. 在每个方法前注释,说明它的用法、输入类型和返回值类型信息。

26. 使用类似Silverlight Spy的工具,检查和操控Silverlight应用在运行时对XMAL的渲染,以此来改善效率。这可以在设计执行XAML时,节省大量退回和来回修改的时间。

27. 使用filddler工具通过检查HTTP/网络流量和带宽,来跟踪web应用和服务的性能。

28. 如果你想确认Visual Studio以外的方法,请使用WCFTestClient.exe工具,或者装载它的进程到Visual Studio来进行调试。

29. 在任何合理的地方使用constants和readonly。参考:/msdnmsdn

30. 尽量避免强制转换和类型转换,因为会造成性能损失。参考:msdn

31. 对于你想提供自定义信息的类,请重载ToString(来自Object类)。参考:msdn

32. 避免直接从其他代码中ctrl+c/ctrl+v。一直建议还是自己用手敲,即使你已经找到相关代码。这样可以锻炼自己写代码能力,还能正确理解那段代码的用法。最终你永远都不会忘记那段代码。

33. 保持阅读书籍和文章的良好习惯,遵循大神们的实践指导。(比如微软专家和一些著名的专家,Martin Fowler, Kent Beck, Jeffrey Ritcher, Ward Cunningham, Scott Hanselman, Scott Guthrie, Donald E Knuth.)

34. 确认代码是否有内存泄漏。如果有,请确保已修正。参考:blogs.msdn.com

35. 尽可能参加专家们组织的技术研讨会,可以接触到最新的软件趋势、技术和最佳实践

36. 要透彻理解OOP概念,并尽可能在代码里实现。

37. 知道项目设计架构,可以从整体上理解程序的执行流程。

38. 采取必要措施阻止避免任何交叉脚本攻击、SQL注入和其他安全漏洞。

39. 永远记得将保密和敏感信息加密(通过使用好的加密算法),比如保存到数据库的密码和保存在web.config文件中的连接字符,要避免被非认证的用户操纵。

40. 避免对已知类型(原始类型)使用默认关键字,比如int, decimal, bool等。多数情况下,如果不确定是值类型还是引用类型,就使用泛型类型(T)。参考:msdn

41. 微软(在代码分析条例和指导中)并不推荐使用’out’和’ref’,这些关键字是通过引用传参,请注意,’ref’参数在传入被调用方法之前,应当在调用方法中先初始化,但’out’参数就不是这样。参考:msdn

2013八月23

全局存储过程sp_

sql server 评论关闭

以SP_开头的存储过程不是会先去找系统存储过程。 是先去master数据库中找这个存储过程。。。之后再去用户数据库中找这个存储过程,所以假如自己写了一个对index操作的SP。 直接放在master数据库中,以SP_开头。 这样在Job的定义中。 选择到用户数据库,然后执行这个SP即可。

这样就可实现在master建立一存储过程,在所有库中均可调用。
2013八月20

配置job管理权限

sql server 评论关闭

若要配置用户以创建或执行 Microsoft SQL Server 代理作业,必须先将某个现有 SQL Server 登录名或 msdb 角色添加到 msdb 数据库中的下列 SQL Server 代理固定数据库角色之一:SQLAgentUserRole、SQLAgentReaderRole 或 SQLAgentOperatorRole。

配置帐户以创建和管理 SQL Server 代理作业

2013八月16

复制分发参数配置

通过sp_help_agent_profile查看代理类型所对应的profile_id,下面是此过程的返回结果 profile_id    profile_name    agent_type    type    description    def_profile
1    默认代理配置文件    1    0    NULL    1
2    默认代理配置文件    2    0    NULL    1
3    详细历史记录代理配置文件    2    0    用于详细历史记录日志的代理配置文件。    0
4    默认代理配置文件    3    0    NULL    1
5    详细历史记录代理配置文件    3    0    用于详细历史记录日志的代理配置文件。    0
6    默认代理配置文件    4    0    NULL    1
7    慢速链接代理配置文件    4    0    用于低带宽连接的代理配置文件。    0
8    详细历史记录代理配置文件    4    0    用于详细历史记录日志的代理配置文件。    0
9    Windows Synchronization Manager profile    4    0    Windows 同步管理器所用的配置文件。    0
10    Windows Synchronization Manager profile    3    0    Windows 同步管理器所用的配置文件。    0
11    默认代理配置文件    9    0    用于已复制的排队事务读取器的代理配置文件。    1
12    行计数验证配置文件    4    0    合并代理用于执行行计数验证的配置文件。    0
13    行计数和校验和验证配置文件    4    0    合并代理用于执行行计数和校验和验证的配置文件。    0
14    遇到数据一致性错误时继续。    3    0    用于跳过数据一致性错误的代理配置文件。它只能由 SQL Server 订阅服务器使用。    0
15    大容量服务器对服务器的配置文件    4    0    合并代理配置文件已经优化,适用于服务器之间的大容量同步。    0
16    用于 OLEDB 流式处理的分发配置文件    3    0    使用 OLEDB 流式处理为处理 LOB 数据启用的分发代理配置文件。    0


通常 快照代理 agent_type = 1,所对应的profile_id = 1

日志读取代理 agent_type = 2,所对应的profile_id = 2

分发代理 agent_type = 3,所对应的profile_id = 4

如下命令返回某个代理的配置信息,注意后面的参数是profile_id

sp_help_agent_parameter @profile_id

sp_help_agent_parameter 1 返回快照代理配置参数

profile_id parameter_name value

1 -BcpBatchSize 100000

1 -HistoryVerboseLevel 2

1 -LoginTimeout 15

1 -QueryTimeout 1800

在快照代理中增加MaxBcpThreads配置参数为20

sp_add_agent_parameter 1,'MaxBcpThreads',20

在日志读取代理中修改PollingInterval配置参数为3

sp_change_agent_parameter 2,'PollingInterval',3

2013八月16

复制分发跳过错误

sql server 评论关闭
 
1,临时跳过
–@publisher @@SERVERNAME,
–@publisher_db db_name(),
–@publication dbo.MSpublication publication,
–@subscriber sysname,
–@subscriber_db sysname
 
–在分发数据库上执行
sp_helpsubscriptionerrors 'SQLCLUSTER','brm_lvjian','brm_lvjian','DATABASED','brm_lvjian'
 
–跳过事务的命令(在订阅服务器上执行),对等数据不支持
sp_setsubscriptionxactseqno 'DATABASED','brm_lvjian','brm_lvjian',0x0005168B000054AA000500000000
 
2,遇到错误自动跳过
分发代理的 -SkipErrors 参数,可用来跳过某种类型的错误。
配置:本地发布-分发服务器属性-常规-右下默认配置文件-分发代理
-SkipErrors 参数
默认情况下,发布代理遇到错误时就会停止。 如果使用 -SkipErrors 参数,并指定了预期的或不想让其干扰复制的错误,则代理就会记录错误信息,然后继续运行。 例如,如果要指定分发代理,使其记录重复键违规但继续处理后续事务,就需要指定代理跳过错误 2601(不能在具有唯一索引 '%.*ls' 的对象 '%.*ls' 中插入重复键的行。)和 2627(违反了 %ls 约束 '%.*ls'。 不能在对象 '%.*ls' 中插入重复键):-SkipErrors 2601;2627 
-SkipErrors 参数的最常见用法是使用标题为“遇到数据一致性错误时继续”的分发代理配置文件。 这样,分发代理就会跳过错误 2601、2627 和 20598(应用复制的命令时在订阅服务器上找不到该行)。 有关详细信息,请参阅复制代理配置文件。 除了此预定义的配置文件之外,还可以在创建或修改的代理配置文件中,或在命令行中,指定该参数。 
 
 
 
sp_helpsubscriptionerrors

http://msdn.microsoft.com/zh-cn/library/ms173427.aspx

 
sp_setsubscriptionxactseqno

http://msdn.microsoft.com/zh-cn/library/ms188764.aspx 


 
2013八月16

修改数据库默认位置

sql server 评论关闭
–修改数据库默认位置
USE [master]
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', REG_SZ, N'D:\SQLDATA'
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', REG_SZ, N'D:\SQLDATA'
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory', REG_SZ, N'D:\SQLDATA'
GO
 
2013八月16

更改服务器名

sql server 评论关闭
exec sp_dropserver <(用select @@SERVERNAME显示出来的旧名)>
GO
exec sp_addserver <你现在的计算机名>, LOCAL
GO

SELECT @@SERVERNAME,SERVERPROPERTY('ServerName')
2013八月16

数据库账号权限迁移

sql server 评论关闭
如何解决在运行 SQL Server 的服务器之间移动数据库时的权限问题

思路:
1,账号:利用链接1脚本生成,主要是为了sid,以保证用用户数据库的一样
   注:链接1脚本支持sqlserver2005以上版本
2,权限:备份或附加数据库后,因为步骤1中的sid已经在新服务器上创立,故权限会自动匹配上。
 

2013八月16

只读账号设置-db_datareader

sql server 评论关闭

为防止正式环境数据库被篡改,但又要保证可以正常查询处理问题,可以将账号的数据库访问权限设置为db_datareader
数据库权限:单独设置的优先,如给了一账号只读权限,若别开一张表给于此账号写权限,那么单独设置的写权限优先级最高。
注:db_datareader没有存储过程访问权限,若想全开,如下:

GRANT EXEC TO datareader
GRANT ALTER TO datareader
 

固定数据库角色
db_owner 数据库所有者

db_accessadmin 数据库访问管理员

db_securityadmin 数据库安全管理员

db_ddladmin 数据库 DDL 管理员

db_backupoperator 数据库备份操作员

db_datareader 数据库数据读取者

db_datawriter 数据库数据写入者

db_denydatareader 数据库拒绝数据读取者

db_denydatawriter 数据库拒绝数据写入者

固定服务器角色 描述
sysadmin 在 SQL Server 中进行任何活动。该角色的权限跨越所有其它固定服务器角色。

serveradmin 配置服务器范围的设置,关闭服务器。

setupadmin 添加和删除链接服务器,并执行某些系统存储过程(如 sp_serveroption)。

securityadmin 管理服务器登录和 CREATE DATABASE 权限,还可以读取错误日志和更改密码。。

processadmin 管理在 SQL Server 实例中运行的进程。

dbcreator 创建、改变和除去数据库。

diskadmin 管理磁盘文件。

bulkadmin 执行 BULK INSERT 语句。

固定数据库角色的权限

2013八月16

数据库建立初步

sql server 评论关闭
1,数据文件等于CPU的数量数,不过要小于等于8
   Tempdb文件数量为cpu数目一半,不过大小要相等,否则自增长可能会发生在最大的文件上,(参考微软数据库支持组的:Tempdb怎么会成为性能瓶颈)
   文件大小可设置大一些如1G,自增长设置为1G,不要设置成百分比,数据会对不齐
   log文件不用,因为是顺序写,写满一个文件再写再一个
2,更改默认端口
3,如果条件允许(有3或3个以上的物理盘) ,日志和数据文件应该位于不同的磁盘
4,禁用SA
5,建立定时运行索引维护,以降低索引碎片,降低表空间。【索引维护1-索引碎片整理】

禁用sa用户.
create login [admin_sql] from windows;
go
sp_addsrvrolemember [admin_sql],sysadmin
go
ALTER LOGIN [sa] DISABLE
GO

根据cpu数目,更改tempdb数据文件,日志文件。
USE master
DECLARE @i int,@s varchar(4000),@c int
set @i=1
select @c=cpu_count from sys.dm_os_sys_info --给变量赋值,获取cpu数目
while (@i<@c/2 and @i<8)
begin
--获取创建tempdb文件的脚本
set
@s=
'alter database tempdb add file (name=tempdev'
+convert(varchar,@i)
+',filename=''d:\SQLData\tempdev'   --文件存放路径命名规则:如果是2块盘,次要数据文件放在d盘,其余不变.
+convert(varchar,@i)
+'.ndf'',SIZE = 1024000KB , FILEGROWTH = 512000KB )'
--执行脚本
exec(@s)
set @i=@i+1
end

--修改日志文件 ,数据文件的初始配置
ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev', SIZE = 102400KB , FILEGROWTH = 102400KB)
GO
ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'templog', SIZE = 1024000KB , FILEGROWTH = 102400KB)
GO

参考:SQL Server中的高可用性(2)—-文件与文件组

2013八月7

缓存:MongoDB redis memcached

ASP.NET 评论关闭

mongodb和memcached不是一个范畴内的东西。mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据。mongodb和memcached不存在谁替换谁的问题。



和memcached更为接近的是redis。它们都是内存型数据库,数据保存在内存中,通过tcp直接存取,优势是速度快,并发高,缺点是数据类型有限,查询功能不强,一般用作缓存。在我们团队的项目中,一开始用的是memcached,后来用redis替代。



相比memcached:



1、redis具有持久化机制,可以定期将内存中的数据持久化到硬盘上。



2、redis具备binlog功能,可以将所有操作写入日志,当redis出现故障,可依照binlog进行数据恢复。



3、redis支持virtual memory,可以限定内存使用大小,当数据超过阈值,则通过类似LRU的算法把内存中的最不常用数据保存到硬盘的页面文件中。



4、redis原生支持的数据类型更多,使用的想象空间更大。



5、前面有位朋友所提及的一致性哈希,用在redis的sharding中,一般是在负载非常高需要水平扩展时使用。我们还没有用到这方面的功能,一般的项目,单机足够支撑并发了。redis 3.0将推出cluster,功能更加强大。



6、redis更多优点,请移步官方网站查询。

MongoDB 或者 redis 可以替代 memcached 吗?

2013八月2

磁盘空间查看

sql server 评论关闭

Method 1:

EXEC MASTER..xp_fixeddrives

GO

 

Method 2:

SELECT DISTINCT DB_NAME(dovs.database_idDBName,

mf.physical_name PhysicalFileLocation,

dovs.logical_volume_name AS LogicalName,

dovs.volume_mount_point AS Drive,

CONVERT(INT,dovs.available_bytes/1048576.0AS FreeSpaceInMB

FROM sys.master_files mf

CROSS APPLY sys.dm_os_volume_stats(mf.database_idmf.FILE_IDdovs

ORDER BY FreeSpaceInMB ASC

GO

引自:SQL SERVER – Disk Space Monitoring – Detecting Low Disk Space on Server