图 9:在SQL Server 2000和2008中的用户/schema/对象
在SQL Server 2000 中当你需要改变对象的所有权时就会遇到用户和schemas的统一问题,例如当Alice离开公司而Lucinda接替了Alice的工作。那么一个系统管理员需要将Alice所拥有的所有对象的所有权改变为Lucinda的。一个更大的问题是在Lucinda具有了表的所有权之后你需要将所有涉及到Alice.Table1的Transact-SQL或客户端应用程序代码改变为Lucinda.Table1。这取决于Alice所拥有的对象的数目和有多少应用程序中内嵌了这个名字;这是一个很大的消耗。Microsoft很久以前就建议内置的dbo用户拥有所有的数据库对象来解决这些问题。更改一个数据库所有权比更改许多对象和客户端应用程序要容易得多。
注意 不要被SQL Server 2000的CREATE SCHEMA语句混淆。这只是一个创建特定用户所拥有的表和视图和授权的简便方法。你可以使用这个语句来命名一个schema的所有者但是不能命名这个schema。因为要改变所有权的问题,SQL Server仍然不能将所有者链接到schema上。
SQL Server 2008通过将用户和schema分离开来从而解决了这个问题并实现了SQL-99 schema,如图9的下面部分所示。当你使用新的CREATE USER DDL创建一个新的用户Alice,SQL Server不再自动地创建具有相同名称的schema。相反地,你必须显式创建一个schema并将它的所有权分配给一个用户。因为显示的所有数据库对象现在包含在Schema1 schema中,这是Alice一开始拥有的,因此通过简单地更改schema的所有权给Lucinda来更改所有的schema对象的所有权就很简单了。每一个用户还可以拥有一个分配给它的默认的schema,因此SQL Server假定在默认的schema中,所有对象按名称引用而没有按schema引用。在图9的下面部分,如果Alice将Schema1作为她的默认schema,那么她可以将这个表作为Schema1.Table1或简单地作为Table1。用户Carol可能没有一个默认的与她的用户名关联的schema,她需要将这个表作为Schema1.Table1。任何没有定义默认schema的用户默认的schema是dbo。在SQL Server 2008中完全标准的对象名称具有一个四部分组成的结构,这与SQL Server之前版本中的类似:
server.database.schema.object
如同在之前版本中的一样,如果对象是在代码运行的同一台服务器上那么你可以省略服务器名称。如果连接打开了同一个数据库那么你可以忽略数据库名称。而如果它是当前用户默认的schema或者是dbo所拥有的,那么你可以忽略schema 名称,因为那是当SQL Server 试图消除一个对象名称的歧义时采取的最后手段的schema。
使用CREATE USER 语句替代sp_adduser 来创建新的用户。这个系统存储过程仍然围绕向后的兼容性,并已被修改了一点来适应新的用户和schemas的分离。sp_adduser 创建了一个schema,它使用相同的名称作为新的用户名称或应用程序角色,并指定这个schema 作为用户默认的schema,模仿SQL Server 2000行动但提供了一个单独的schema。
注意 在使用ALTER AUTHORIZATION 语句时,它可能会导致你拥有一个在我的中的表(反之亦然)。这会导致严重的问题。例如,谁拥有这个表上的触发器,你还是我?底线是它现在能够巧妙地发现schema范围的对象或类型的所有者。这有两个方法:
· 使用OBJECTPROPERTY(id, ''OwnerId'')来发现一个对象的真正所有者。
· 使用TYPEPROPERTY(type,''OwnerId'')来发现一个类型的真正所有者。
SQL Server 可以使用同义字来帮助保存按键。你可以为任何使用两部分、三部分或四部