与SQL 2005之前的版本相比,2005及之后的版本对数据库对象的管理及查询的执行上下文行为做了两个重要的改变:
1. 用户-架构(User-Schema)分离。即用户不再作为数据库对象的直接拥有者(owner),而是在数据库对象和用户之前加了一层schema。Schema即数据库对象的集合,用户可以拥有多个schema,每个用户有一个default schema。
2. 执行查询的时候可以切换用户上下文。这包括在批处理中通过EXECUTE AS语句直接切换上下文,以及另一个更常见的用法:在创建存储过程或其它模块时指定用户执行的上下文(WITH EXECUTE AS)。
关于第二点,有一个有意思的实验:
1. 创建一个测试数据库及表:
CREATE DATABASE mydb
go
USE mydb
go
create table dbo.tbl_TestPer(ID INT, name sysname)
go
INSERT INTO tbl_TestPer SELECT 1, 'Iori'
2. 创建如下存储过程:
CREATE PROC [dbo].[sp_TestPer1]
WITH EXECUTE AS CALLER
AS
BEGIN
SELECT SYSTEM_USER, CURRENT_USER
SELECT * FROM dbo.tbl_TestPer
END
3. 创建一个测试用户并修改其权限