4.1 SQL Server表的类型
SQL Server中的数据表分为永久表和临时表。临时表又分为本地临时表和全局临时表。系统根据表名前有无符号#确定创建的是临时表还是永久表。永久表又分系统(永久)表和用户(永久)表,本章后面所创建的表都是用户表。
4.1.1 SQL Server的临时表
临时表是非常有用的工作空间,可以用临时表来处理中间数据,或者用临时表与其他连接共享进行中的工作。可以在任何数据库里创建临时表,但这些临时表只能放在tempdb数据库里,每次SQL Server重新启动,tempdb数据库就被重新创建。
SQL Server中主要以两种方式来使用临时表:本地和全局。
(1)本地临时表(#)
在表名前加上符号#,就可以在任何数据库中创建一个本地临时表。只有创建该表的连接才能访问该表,使得该表真正成为本地临时表,而且这种特权还不能授予另一个连接。作为一个临时表,它的生命期是与创建它的连接的生命期一致的,一旦该连接断开,它就被自动删除。该连接也可以使用DROP TABLE语句删除该表。
因为本地临时表只属于创建它的连接,所以,即使选择了在另一个连接里使用的表名作为本地临时表的表名,也不会有名字冲突的问题。
(2)全局临时表(##)
在表名前加上符号##,就可以在任何数据库和任何连接里创建全局临时表。然后任何连接都可以访问该表,以检索该表数据或更新数据。与本地临时表不同,所有连接都可以使用全局临时表的唯一备份。因此,如果另一个连接已经创建了一个同名的全局临时表,就会遭遇到名字冲突的问题,相应的CREATE TABLE语句就会失败。
在全局临时表的创建连接终止之前或对全局临时表的所有当前使用完成之前,全局临时表都存在。在创建连接终止之后,只有那些已经访问了全局临时表但访问还没有完成的连接允许继续进行,其他新的访问将不再允许,一般情况下,在使用它的最后一个会话结束时它被自动删除。如果希望全局临时表永远存在,可以用存储过程创建全局临时表,这样,只要SQL Server启动,它就会自动启动。
4.1.2 SQL Server的系统表和系统视图
系统表中的数据组成了SQL Server系统利用的数据字典,系统表记录所有服务器活动的信息,是维护所有存储在其中的对象、数据类型、约束、配置选项等可利用资源的相关信息。
一些系统表只存在于master数据库中,它们包含系统级信息;另一些系统表则存在于每一个数据库(包括master数据库),它们包含属于这个特定数据库的对象和资源的相关信息。
1.仅在master数据库中的系统表和系统视图
这些表或视图存储服务器级系统信息,在SQL Server 2000里共有18个表,在SQL Server 2005里对应20个视图。如表4-1所示。
表4-1 存储在master 数据库中的SQL Server 2000 系统表和 SQL Server 2005 系统视图之间的映射
2.每个数据库中都有的系统表和系统视图
这些表或视图为每个数据库存储数据库级系统信息,在SQL Server 2000里共有17个表,在SQL Server 2005里对应22个视图,如表4-2所示。
表4-2 存储在每个数据库中的SQL Server 2000 系统表和 SQL Server 2005 系统视图之间的映射
由表4-2可见,一些系统表或系统视图只存在于master数据库中,它们包含系统级信息;而其他系统表或系统视图则存在于每个数据库中,它们包含属于这个特定数据库对象和资源的相关信息。
注意:SQL Server 2005兼容SQL Server 2000,系统表和系统视图都可以使用。不允许使用SQL语句直接修改系统表或系统视图中的内容;不允许编写程序直接访问系统表或系统视图中的信息;如果需要系统信息,可以通过系统的存储过程和系统提供的函数进行。