数据库对象:所有的表,视图,存储过程,触发器都称为数据库对象。我们可以拿一个网站来做类比。一个网站包含很多的网页,图片,脚本文件,我们姑且称它为网站对象。显然,我们不可能把所有的网站对象都放到一个文件夹下面,同样道理,数据库对象也不可能象煮饺子一样就在数据库里这么一锅出。对于网站,我们通常会把不同模块的文件放在不同的子文件夹下,那么谁是存放数据库对象的文件夹呢?答案就是:架构(Schema).
架构:数据库架构是一个独立于数据库用户的非重复命名空间,您可以将架构视为对象的容器,详细参考http://technet.microsoft.com/zh-cn/library/ms190387.aspx.我们知道,在JAVA中,命名空间名其实就是文件夹名。因此我们非常明确一点:一个对象只能属于一个架构,就像一个文件只能存放于一个文件夹中一样。与文件夹不同的是,架构是不能嵌套的,如此而已。因此,我们要访问一个数据库对象的时候,通常应该是引用它的全名"架构名. 对象名",这点非常类似C#。结论:架构就是数据库对象的容器。数据库对象是饮料,架构就是杯子,谁拿杯子喝水呢?当然是用户,那么是不是一个用户只能用一个杯子,一个杯子是不是从一而终,只能给一个人用呢?答案不是。
对于架构特点的理解小节如下:
1.一个架构中不能包含相同名称的对象,相同名称的对象可以在不同的架构中存在。
2.一个架构只能有一个所有者,所有者可以是用户, 数据库角色, 应用程序角色。
3.一个用数据库角色可以可以拥有一个默认架构,和多个架构。
4.多个数据库用户可以共享单个默认架构。
5.由于架构与用户独立,删除用户不会删除架构中的对象。
列出系统所有的架构:
select sys.objects.name,sys.schemas.name
from sys.objects,sys.schemas
where sys.objects.type='U' and sys.objects.schema_id=sys.schemas.schema_id
要使用数据库对象,必须将登录映射到数据库用户帐户。这样就可以将数据库用户添加到数据库角色,从而继承与这些角色关联的任何权限集。从 SQL Server 2005 开始,可以授予所有权限。当为应用程序设计安全性时,还必须考虑 public 角色、dbo 用户帐户和 guest 帐户。
公共角色:public 角色包含在每个数据库中,包括系统数据库。无法删除该角色,也无法向其中添加用户或从中删除用户。授予 public 角色的权限由所有其他用户和角色继承,因为默认情况下,它们属于 public 角色。仅为 public 角色授予您希望所有用户都具有的权限。
dbo 用户帐户:dbo 或数据库所有者是具有在数据库中执行所有活动的默示权限的用户帐户。sysadmin 固定服务器角色的成员会自动映射到 dbo。dbo 用户帐户经常与db_owner 固定数据库角色相混淆。db_owner 的作用域是一个数据库;sysadmin 的作用域是整个服务器。db_owner 角色中的成员无法授予 dbo 用户特权。