转载自SqlServer体系结构 - dehigher - 博客园
1.sql得abc特色
Application应用:理念是提供软件、硬件、服务在内得完整解决方案
Box盒子:传统部署方式、部署在企业内部
Cloud:私有云、公有云;私有云性能有限,公有云Azure Sql,软硬件、运维、HADR、更新都由微软负责
2.Azure Sql
1)Azure sql(概念性服务器)有多个数据库,但一次只能连接一个数据库,客户不能在数据库之间切换,也不能编写多数据库查询
2)Azure sql引擎是一种专用引擎,但使用了相同得代码基、实现T-SQL功能与本地化实现一致
3)有一些内部部署得SQL server t-sql中没有
3.Sql Server实例
1)sql server实例是一个已安装得sqlserver数据库引擎或服务
2)可以在同一台计算机上安装多个sql server实例,在安全、数据、资源上,实例之间相互独立在逻辑级别上,驻留在同一台计算机上得两个实例和驻留在两个计算机上得实例没有不同之处
3)一台计算机上只有一个Default实例(默认实例)、其他都是默认实例、在安装时确定是默认还是命名、后面不能修改
4)连接默认实例、客户端只需要指定ip、连接命名实例,则需要指定ip\实例名称
4.数据库
1)数据库是一个对象容器,包含表、视图、存储过程、其他对象
2)一个数据库实例中可以包含多个数据库、包括系统数据库和用户数据库
3)系统数据库由master、resource、model、tempdb、msdb,但是在Azure sql中客户端只能连接master
4)在一个实例中可以定义多个用户数据库
5)排序规则collation通常在数据库级别定义、确定语言支持、区分大小写、排序规则
5、数据文件和事务日志文件
1)数据库有数据文件Data.mdf和日志文件transactionlog.ldf组成
2)sqlserver可以并行得写入数据文件、但是只能串行得写入事务日志文件。因此,与数据文件不同,事务日志多并不能提高写入性能
3)在创建数据库的时候可以为每个文件(数据文件、日志文件)定义属性、包括名称、初始大小、最大大小、自动增量
4)多个数据文件被组织成“文件组”,对象(表、视图。。。。)被分散在文件组中得文件中
5)一个数据库中至少有一个名为primary的文件组,可以指定哪个文件组作为默认文件组
6)如果创建对象得时候没有显式的指定目标文件组,那么默认放在默认文件组中。创建对象可以通过选择文件组,进行物理布局
7)Azure sql不需要用户关注数据文件和日志文件的布局
8)文件后缀:.mdf代表主数据文件(不要与主数据库文件混淆)、.ldf代表日志数据文件、.ndf代表不是主数据文件
5、登陆安全
1)连接数据库实例,必须先创建一个“login”
2)login绑定windows登陆凭证,这种称为“windows身份验证登录”、登陆时不需要login name、password
3)sqlserver身份验证登陆、需要提供用户名密码、需要将login映射到每一个数据库用户、数据库用户被授予访问数据库中对象权限
6、架构与对象
1)数据库是对象容器其实是简化说法,数据库包含架构、架构包含对象
2)架构才是对象(表、视图。。。)的容器
3)可以在架构级别控制权限,如授予用户对架构的select权限。因此对架构的划分,安全是一个考量因素
4)架构是一个命名空间、通常被用作对象名称的前缀dbo.xxx,dbo是架构名称。这种写法叫做架构限定式对象名称
5)引用对象时,如果省略架构、sql server会在默认架构中找对象,如果没有,会再去dbo架构中找
6)由于省略架构限定寻找的过程需要耗费一定性能,所以sql server始终建议使用架构限定对象名称
7.表定义
use tsql2012;
if object_id('dbo.Employees','U') is not null
drop table dbo.Employees;
create table dbo.Employees(
empid int not null,
firstname varchar(30) not null,
lastname varchar(30) not null,
hiredate date not null,
mgrid int null,
ssn varchar(20) not null,
salary money not null
);
1)定义表要确定数据库、架构
2)使用()而不是{ }
3)use数据库名称 语法在Azure sql中不支持,但是当选中库后执行不会报错,可用于确保创建对象时连接到了正确的数据库
4)if函数调用了object_id(object_name,type)函数,入参为(对象名称、对象类型),U表示用户数据库,该函数存在返回object_id,否则返回null
5)如果没有显示的制定是否允许为null标记、sql server不得不依赖默认值。默认值为(null),强烈建议显示定义、不得依赖默认值
8、数据完整性
8.1完整性说明
1)关系模型最大好处之一就是数据完整性
2)数据完整性作为模型的一部分实施,即作为表定义的一部分这被称为“声明式数据完整性”
3)数据完整性由代码实施、如存储过程、触发器,这被称为“过程式数据完整性“
8.2主键约束
1)主见约束强制唯一性、主键不允许是null、每张表只能由一个主键
2)为保证主键的强制唯一性的物理机制
3)sql
alter table Employees
add constraint PK_Employees
primary key(empid);
8.3 唯一约束
1)与主键不同,表中可以有多个唯一键
2)与主键不同,唯一键可以为null
3)sql
alter table Employees
add constraint UNQ_Employees_ssn
unique(ssn);
8.4 外键约束
1)外键约束强制性引用完整性
2)sql
if object_id('dbo.Orders','U') is not null
drop table dbo.Orders;
create table dbo.Orders
(
orderid int not null,
empid int not null,
custid varchar(10) not null,
orderts datetime2 not null,
qty int not null,
constraint PK_Orders primary key(orderid)
);
alter table dbo.Orders
add constraint FK_Orders_Employees
foreign key(empid)
references dbo.Employees(empid);
alter table dbo.Orders
add constraint FK_Orders_Employees
foreign key(mgrid)
references dbo.Employees(mgrid);
3)外键引用操作
no action:当删除父表记录被引用,无法删除
cascade:级联删除
set default、set null:级联操作设置外键值为default、null
4)外键列允许为null,当为null的时候产生孤立行
8.5 check约束
1)为列定义一个谓语,insert update必须满足该谓语要求
2)sql
alter table dbo.Employees
add constraint CHK_Employees_salary
check (salary>0);
3)当谓语计算为False拒绝插入更新、当计算结果为True或unknown,修改会被接受,如上面的salary为null时 会接受
(1)是默认值表达式
(2)sql
alter table dbo.Orders
add constraint DFT_Orders_orderts
default(sysdatetime()) for orderts;