1. Table可以用来作为安全边界,即表级别安全许可;SQL Server中支持ColumnTable级别安全许可,在SQL Server中还没有行级别安全许可,不过可以通过视图、存储过程、触发器来实现行级别安全许可
  1. A candidate key用来唯一标示一行,主键就是从潜在的多个candidate key中选择的;通常来说,如果表经过了正确的规范化处理的话,一个表应该只有一个candidate key可以用来作为主键,但这不是绝对的;主键必须唯一、不允许为null、不允许修改
  1. surrogate key用来作为表的唯一标示,不是根据真正的数据得来的,和表中其他列不相关;Natural Key则是根据表中的数据形成的
  2. SQL Server2005中大部分system tablessystem views所替代,这些视图是需要权限的,在之前的SQL Server中用户可以修改system tables,这会导致非预期的行为、错误
  3. msdb数据库被SQL Server Agent使用,主要用来组织后台计划任务,在这个数据库中存在大量系统表,不要直接修改这些表
  4. Schema是对象的容器,对象包括TableStored ProcedureFunctionTypeView;也是安全边界,可以在Schema级别设置安全许可,简化安全设置;在SQL Server中对象正式名称为:Server.Database.Schema.Object
  5. SQL Server2000及以前的版本中,对象名称为Server.Database.Owner.Object,从SQL Server2005开始Owner已经不是对象名称的一部分,在升级这些早期的程序时,SQL Server会自动创建一个和owner名称一样的schema
  6. 当没有指定Schema时,使用如下规则:首先检查用户的Default Schema,如果没有找到的话,就检查dbo这个Schema;在代码中包含Schema名称非常重要,这样就不依赖于默认的Schema设置啦
  1. 使用CREATE SCHEMA命令创建SchemaSchema包含名称和ownerSchema和其中包含的对象可以不是同一个owner(这样会导致复杂的安全问题),还可以在该语句中创建对象
  1. DROP表时,所有的permissionconstraintindextrigger也被DROP,引用表的代码不会被删除,包括存储过程、函数,这将导致这些代码引用不存在的对象,SQL Server 2008引入了许多Dependency Views用来定位引用不存在对象的代码,包括sys.sql_expression_dependencies,也可以通过sys.dm_sql_referenced_entitiessys.dm_sql_referencing_entities这些dynamic management views查询
  2. 修改表时将保留表的permissiondata,可以添加或者删除列和约束,启用或者禁用约束和触发器;注意添加和删除列的语法是不一致的,添加列时不能指定COLUMN关键字,删除列时必须指定COLUMN关键字,否则会被认为是删除约束,而不是删除列
  3. 临时表应该显式删除,而不是依赖于自动被删除,通常都是通过SELECT INTO语句创建的;临时表还可以用来在两个存储过程之间传递结果集,比如在sp_a中使用sp_bsp_b创建临时表,则这个临时表对sp_a也可见,这样做违背了代码抽象的原则,不鼓励这样做,此时可以考虑使用table-valued parameters;过度使用临时表会带来性能和资源问题,也表明缺乏基于集合设计的思想
  4. 计算列通常用来在不需要去规范化的情况下就可以简化数据访问;非持久化的计算列在每次SELECT语句执行时都要执行计算,持久化的计算列在插入或者更新时计算,在SELECT时和其他数据一样(不需要计算),持久化计算列和非持久化计算列本质区别就是执行时机,持久化计算列在更新时进行计算,适用于很少更新但是经常查询的情形,非持久化计算列在查询时更新,适用于经常更新但是很少查询的情形,一般的应用程序都是经常查询很少更新,因此一般情况下,持久化计算力性能更好一些