SQL Server 2005 中数据库引擎功能的行为更改
更新日期: 2006 年 7 月 17 日
本主题介绍某些数据库引擎功能在 Microsoft SQL Server 2005 中与在 SQL Server 的早期版本中不同的行为更改。
备份和恢复
还原现有数据库时,SQL Server 2005 要求您在完整恢复或大容量恢复模式下还原数据库之前备份日志的尾部。除非 RESTORE 语句包含 WITH REPLACE 或 WITH STOPAT 子句,否则,在备份日志尾部前尝试还原数据库将导致错误。有关详细信息,请参阅尾日志备份。
游标
下表列出了 SQL Server 2000 中会发生而 SQL Server 2005 中不会发生的隐式游标转换。解决方法是请求特定类型的游标,而不是依赖于隐式转换。
条件 | SQL Server 2000 中转换前的游标 | 转换后的游标 |
---|---|---|
查询包含内联表值函数。 |
动态/键集 |
静态 |
查询引用远程对象。 |
快进 |
键集 |
查询不包含表。 |
快进 |
静态 |
查询包含表函数。 |
快进 |
静态 |
查询包含派生表。 |
快进 |
静态 |
查询包含多语句表函数。 |
动态 键集 |
键集到静态 静态 |
查询包含虚拟表。 |
动态/键集 |
静态 |
查询包含带有 TOP 的视图。 |
快进 |
静态 |
查询包含可更新的分区视图。 |
快进 |
静态 |
API 游标查询包含具有唯一访问路径但不处于基表级别的索引视图。 |
键集 |
静态 |
API 游标查询包含没有聚集索引或唯一键的表。 |
键集 |
静态 |
API 游标结果集包含 text、ntext 或 image 列。 |
快进 |
动态 |
SQL Server 2005 不支持异步生成键集驱动的或静态的 Transact-SQL 游标。Transact-SQL 游标操作(如 OPEN 或 FETCH)通常是成批执行的,因此不需要异步生成 Transact-SQL 游标。SQL Server 2005 继续支持异步键集驱动的或静态的 API 服务器游标,但由于每个游标操作的客户端往返,因此需要注意其中的低滞后时间 OPEN。
在 SQL Server 2005 中,如果对没有唯一索引的表声明动态游标并在游标外删除行,则随后对游标的刷新会检索包含 NULL 数据的行的占位符。在 SQL Server 的早期版本中,游标不返回受影响的行。
在 SQL Server 2005 中,如果通过批处理或存储过程中的条件逻辑可以声明不同的游标,则通过游标执行的 INSERT、UPDATE 和 DELETE 语句会导致重新编译。在 SQL Server 2000 中,这些语句不会导致重新编译。
在下面的示例中,UPDATE
语句将导致模块的重新编译。
IF(@some_condition=1)
DECLARE c CURSOR FOR
SELECT region FROM db.dbo.mytable ORDER BY lastname
ELSE
DECLARE c CURSOR FOR
SELECT postalcode FROM db.dbo.mytable ORDER BY firstname
...
FETCH NEXT FROM c
...
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
若要避免重新编译,请按以下方法重新编写该代码:
IF (@some_condition=1)
BEGIN
DECLARE c CURSOR FOR
SELECT region FROM db.dbo.mytable ORDER BY lastname
FETCH NEXT FROM c
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
END
ELSE
BEGIN
DECLARE c CURSOR FOR
SELECT postalcode FROM db.dbo.mytable ORDER BY firstname
FETCH NEXT FROM c
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
END
在 SQL Server 2005 中,除非查询中指定了更高的锁提示,否则游标滚动锁定将获取从 S(共享)到 U(更新)的锁升级。SQL Server 2000 为滚动锁定游标透明地添加 U 锁提示。SQL Server 2005 行为可以提高并发性能,但也可能使并发游标出现死锁(消息 1205)。使用 UPDLOCK 提示可以获得您想要的行为。有关详细信息,请参阅表提示 (Transact-SQL)。
在 SQL Server 2000 中,当游标提取缓冲区中多次出现对一个列或行值进行更新时,由于提取缓冲区大小或行在缓冲区中所处位置的原因,某个更新之外出现该值时可能不会反映这一更新。在 SQL Server 2005 中,提取缓冲区中的行更新后,无论提取缓冲区的大小或行的位置如何,这些值始终保持一致。
在 SQL Server 2000 中,涉及 UNION ALL 语句的游标会根据 UNION 中的第一个集错误地返回可更新性信息。因此,某些游标在不可更新的情况下会被报告为可更新。SQL Server 2005 将 UNION ALL 结果报告为计算结果,因此是不可更新的。如果所有游标行都来自一个表或视图,则您可以通过将使用 UNION 的查询改为使用 IN 或 OR 子句来定义可更新的游标。
在 SQL Server 2000 中,如果 CURSOR_CLOSE_ON_COMMIT 选项设为 ON,则提交事务时,连接中的所有游标都将关闭。在 SQL Server 2005 中,只有在当前事务中打开的游标才会在提交事务时关闭。在事务开始前打开的游标仍处于打开状态。
SQL Server 2000 允许使用某些无效的游标声明,并可将其转换为其他类型的游标。SQL Server 2005 不允许使用无效的声明。例如,同时请求可更新性和不区分性的游标在 SQL Server 2005 中无效,并将因出现错误而失败。
数据库、数据和日志文件
SQL Server 2000 行为 | SQL Server 2005 行为 |
---|---|
AUTO_CLOSE 数据库选项是一个同步进程,当与数据库引擎重复建立和中断连接的应用程序访问数据库时,该选项可能会降低性能。 |
AUTO_CLOSE 进程是异步进程。重复打开和关闭数据库不会再降低性能。 |
原始分区上的文件不会自动增长;因此,os_file_name 指定原始分区时,不需要指定 MAXSIZE 和 FILEGROWTH 参数。 |
原始分区上的文件可以自动增长。可以指定 MAXSIZE 和 FILEGROWTH 参数。 |
不对每个数据库的数据文件和日志文件设置权限。 |
只要下列操作应用于数据库,就会对数据文件和日志文件设置权限:
创建修改以添加新文件
附加备份
分离还原
|
如果这些文件位于具有打开权限的目录中,那么以上权限可以防止文件被意外篡改。有关详细信息,请参阅保护数据和日志文件的安全。
注意:
Microsoft SQL Server 2005 Express Edition 不设置数据文件和日志文件权限。
链接服务器和分布式查询
使用“SQLOLEDB”作为访问接口名称定义的链接服务器将在升级时被修改为“SQLNCLI”(SQL Native Client OLE DB 访问接口)。sys.sysservers 兼容性视图显示将“SQLNCLI”用作“SQLOLEDB”的链接服务器。SQL Server 2005 的目录视图 sys.servers 显示将“SQLNCLI”用作“SQLNCLI”的链接服务器。
当在纤程模式下运行 SQL Server 时,不支持异类查询和 OLE DB 访问接口的使用。当轻型池高级配置选项设为 1 时启用纤程模式。
SQL Native Client OLE DB 访问接口不能在进程外进行实例化。
在 SQL Server 2005 中,来自链接服务器的警告消息不会传播给客户端。下面是这些警告中最重要的一些类别:
- 已在聚合计算中消除 NULL 值的符合 ANSI 的警告
- 算术溢出警告
例如,如果 col1
中有 NULL 值,则下列 Transact-SQL 语句可能生成一个警告消息:
SELECT SUM(col1)
FROM <Table>
GROUP BY col2
在 SQL Server 2000 和更早的版本中,链接服务器将警告消息传播给客户端。在 SQL Server 2005 中,链接服务器已不这样做。
在 SQL Server 2000 中,当远程存储过程由于编译时错误(如参数绑定不正确)而不能成功运行时,返回值/状态会设为 0。而当 SQL Server 2005 中出现这种情况时,返回值/状态将设为 NULL。
查询处理器体系结构
对于以下列形式提交的批处理,SQL Server 2000 与 SQL Server 2005 在重新编译期间使用参数值的方式有所不同:
- 存储过程
- 使用 sp_executesql
- 预定义语句
当 SQL Server 2000 重新编译这些批处理时,它使用作为重新编译的一部分被调用的批处理所带有的参数值。当 SQL Server 2005 重新编译这些查询时,它使用恰好在导致重新编译的语句之前参数所具有的值。这些值可能不同于最初传递给该批处理的那些值。有关详细信息,请参阅重用参数和执行计划。
安全性
功能 | SQL Server 2000 行为 | SQL Server 2005 行为 |
---|---|---|
GRANT ALL |
授予所有适用的权限。 |
不推荐授予对象和语句的 ALL 权限。执行 GRANT ALL 后,将发生以下情况:
SQL Server 2005 在各作用域内提供可用于管理用户权限的附加权限。例如,CONTROL 权限可用于为对象授予类似所有权的权限。 |
密码比较 |
SQL Server 2000 对每个 SQL Server 登录密码维护两种形式。一种形式是用户提供的实际密码,另一种形式是由 SQL Server 转换为全部字母都大写的密码。这样可以验证不区分大小写的密码。尽管此行为方便了很多用户,但由于它减少了可能的密码数,因此使得猜密码攻击变简单了。 |
只存储实际密码。用户输入的密码必须与服务器中存储的密码相符。如果密码与 SQL Server 中存储的密码不符,则登录失败。如果忘记了密码字符确切的大小写,则必须重新设置密码。 |
更改 sa 帐户的默认语言 |
SQL Server sa 帐户的默认语言是在安装和升级过程中选择的语言。 在 Microsoft SQL Server 的早期版本中,通过运行 sp_configure 更改服务器的默认语言时还会更新 sa 帐户的默认语言。 |
若要在 SQL Server 2005 中更改 sa 帐户的默认语言,必须运行 sp_defaultlanguage 存储过程,执行 DBCC FREESYSTEMCACHE 命令,然后启动新会话。通过运行 sp_configure 更改服务器的默认语言时不会更新 sa 帐户的默认语言。 |
系统存储过程
下表列出了对数据库引擎系统存储过程中的参数的更改。
存储过程 | 参数 | 更改说明 |
---|---|---|
sp_bindefault |
@objname |
大小从 nvarchar(517) 改为 nvarchar(776)。 |
sp_bindrule |
@objname |
大小从 nvarchar(517) 改为 nvarchar(776)。 |
sp_changeobjectowner |
@objname |
大小从 nvarchar(517) 改为 nvarchar(776)。 |
sp_detach_db |
@keepfulltextindexfile |
大小从 nvarchar(517) 改为 nvarchar(776)。 |
sp_fulltext_service |
@action |
大小从 varchar(20) 改为 nvarchar(100)。 |
sp_fulltext_service |
@value |
数据类型从 int 改为 sql_variant。 |
sp_getapplock |
@DbPrincipal |
添加的参数。 |
sp_releaseapplock |
@DbPrincipal |
添加的参数。 |
sp_setapprole |
@fCreateCookie |
添加的参数。 |
sp_setapprole |
@cookie |
添加的参数。 |
sp_settriggerorder |
@stmttype |
大小从 varchar(10) 改为 varchar(50)。 |
sp_settriggerorder |
@namespace |
添加的参数。 |
sp_sproc_columns |
@fUsePattern |
添加的参数。 |
sp_stored_procedures |
@fUsePattern |
添加的参数。 |
sp_table_privileges |
@fUsePattern |
添加的参数。 |
sp_table_privileges_ex |
@fUsePattern |
添加的参数。 |
sp_tables |
@fUsePattern |
添加的参数。 |
sp_tables_ex |
@fUsePattern |
添加的参数。 |
系统表和系统视图
下表列出了对系统表和系统视图中的列的更改。
系统表或系统视图 | 列 | 更改说明 |
---|---|---|
COLUMNS |
ORDINAL_POSITION |
数据类型从 smallint 改为 int。 |
PARAMETERS |
ORDINAL_POSITION |
数据类型从 smallint 改为 int。 |
REFERENTIAL_CONSTRAINTS |
MATCH_OPTION |
大小从 varchar(4) 改为 varchar(7)。 默认值从“NONE”改为“SIMPLE”。 |
REFERENTIAL_CONSTRAINTS |
UPDATE_RULE |
大小从 varchar(9) 改为 varchar(11)。 |
REFERENTIAL_CONSTRAINTS |
DELETE_RULE |
大小从 varchar(9) 改为 varchar(11)。 |
ROUTINE_COLUMNS |
ORDINAL_POSITION |
数据类型从 smallint 改为 int。 |
sysaltfiles |
name |
数据类型从 nchar(128) 改为 sysname。 |
sysaltfiles |
filename |
数据类型从 nchar(260) 改为 nvarchar(260)。 |
sysconfigures |
config |
数据类型从 smallint 改为 int。 |
syscursorcolumns |
data_type_sql |
数据类型从 smallint 改为 int。 |
sysfiles |
name |
数据类型从 nchar(128) 改为 sysname。 |
sysfiles |
filename |
数据类型从 nchar(260) 改为 nvarchar(260)。 |
sysmessages |
严重性 |
数据类型从 smallint 改为 tinyint。 |
sysperfinfo |
cntr_value |
数据类型从 int 改为 bigint。 |
sysprocesses |
waittime |
数据类型从 int 改为 bigint。 |
sysprocesses |
hostprocess |
大小从 nchar(8) 改为 nchar(10)。 |
sysprocesses |
request_id |
添加的列。 |
sysprotects |
列 |
大小从 varbinary(4000) 改为 varbinary(8000)。 |
sysservers |
srvcollation |
数据类型从 int 改为 sysname。 |
sysservers |
nonsqlsub |
添加的列。 |
sysoledbusers |
rmtpassword |
仅返回 NULL。 |
sysindexes |
密钥 |
仅返回 NULL。 |
sysindexes |
statblob |
仅返回 NULL。 |
syscomments |
compressed |
仅返回 0。 |
sysdevices |
size |
仅返回 0。 |
sysobjects |
schema_ver |
仅返回 0。 |
sysremotelogins |
status |
仅返回 0。 |
sysservers |
topologyx |
仅返回 0。 |
sysservers |
topologyy |
仅返回 0。 |
Transact-SQL
功能 | SQL Server 2000 行为 | SQL Server 2005 行为 |
---|---|---|
bcp 实用工具 |
对表具有 INSERT 和 SELECT 权限的用户可以使用 bcp 实用工具通过以下命令向该表大容量加载数据:
默认情况下,此命令对目标表禁用 CHECK 约束和触发器。 |
若要运行 bcp 实用工具,如果在大容量复制过程中禁用 CHECK 约束和触发器,则用户必须具有目标表的 ALTER 权限以及 INSERT 和 SELECT 权限。升级到 SQL Server 2005 后,应用程序中的 bcp 命令可能会因权限不足而失败。可以使用下列方法之一解决此问题:
|
内置系统函数 |
每次对内置函数的引用(如 NEWID 和 RAND)都会生成不同的结果,这是因为它对每次外部查询引用都会计算一次。 |
外部查询可以多次引用视图或派生表的列。但是,如果这些列是通过调用函数(如 NEWID 和 RAND)定义的,则这样的多次调用会使该函数对视图或派生表内的每个实际调用只计算一次。 在子查询中对这些列的多次引用不会使这些函数被计算多次。这使您可以在子查询中重用这些函数所生成的值。 例如,在 SQL Server 2000 中,下面的查询将返回两个不同的值。在 SQL Server 2005 中,此查询返回一个值。
|
BULK INSERT |
BULK INSERT 支持将使用科学计数法表示数值的字符串从字符串类型转换为十进制类型。 |
BULK INSERT 中使用的从字符串到十进制类型的转换所遵从的规则与 Transact-SQL CONVERT 函数遵从的规则相同。此函数拒绝使用了科学计数法表示数值的字符串。因此,BULK INSERT 将这些字符串视为无效的值并报告转换错误。有关详细信息,请参阅 BULK INSERT (Transact-SQL)。 |
datetime 转换 |
从字符串到 datetime 的转换标记为确定性转换。但是,这对于下表中列出的样式却不成立。对于这些样式,该转换取决于语言设置。 下表列出了从字符串到 datetime 的转换为不确定性转换的样式。
低于 100 的所有样式1106
107109
113130
|
1 样式 20 和 21 除外
SQL Server 2005 将从字符串到 datetime 的转换标记为不确定性转换。
DBCC CHECKFILEGROUP
如果指定文件组中的一个非聚集索引与另一文件组中的表相关联,则将检查该索引和另一文件组中的基表。
如果指定文件组中的一个非聚集索引与另一文件组中的表相关联,则不会检查该索引,因为基表不可用于验证。
DBCC SHOW_STATISTICS
DBCC SHOW_STATISTICS 返回的行集不包含 Name 列。
DBCC SHOW_STATISTICS 返回的第一个行集包含一个附加列,该列的标题为 Name。此列在结果集中显示为第一列。如果您的应用程序是按序号位置访问 DBCC SHOW_STATISTICS 返回的列的,请将它们改为按名称访问列。
DROP LOGIN
执行 DROP LOGIN 时,如果数据库用户映射到该登录名,则该登录名不会被删除。
执行 DROP LOGIN 时,即使数据库用户映射到该登录名,该登录名仍会被删除。
计算列、CHECK 约束和 DEFAULT 约束中的表达式
表达式的原始文本(包括空格)保留在目录元数据中。例如,输入的 c1 + c2 + 1
计算列表达式在 syscomments 系统表的 text 列中将精确地显示为输入的内容。
对表达式的原始文本进行解码和规范化,并且该操作的输出存储在目录元数据中。解码后的表达式的语义将等同于原始文本,但是没有语法保证。例如,输入的 c1 + c2 + 1
计算列表达式在 sys.computed_columns 系统目录视图的定义列中将显示为 (([c1]+[c2])+(1))
。
查询中的表达式
查询中不安全的表达式并不总是生成运行时异常。
查询中的表达式在 SQL Server 2005 中的计算时间有时短于它们在 SQL Server 2000 中的计算时间。此行为具有以下非常有用的优点:
- 能够将计算列的索引和查询中与计算列表达式相同的表达式相匹配。
- 防止出现多余的表达式计算结果。
但是,根据查询的性质和数据库中的数据,如果查询包含的现有表达式不安全,则 SQL Server 2005 中可能会出现运行时异常。这些运行时异常包括:
- 算术异常:被零除、溢出和下溢。
- 转换失败,如丢失精度和尝试将非数值字符串转换为数值。
- 对一组不保证全为非空的值进行聚合。
在 SQL Server 2000 中,这些异常可能不会在使用特定数据的特定应用程序中发生。但是,由于更改统计信息而更改的查询计划可能会导致 SQL Server 2000 中出现异常。通过将查询修改为包含条件表达式(如 NULLIF 或 CASE),可以防止出现这些运行时异常。有关详细信息,请参阅故障排除查询表达式中的错误和警告。
fn_servershareddrives
public 角色的成员可以查看系统函数 fn_servershareddrives 返回的数据。
权限更改:fn_servershareddrives 要求用户对服务器具有 VIEW SERVER STATE 权限。
重要提示:
保留此 SQL Server 2000 系统函数是为了向后兼容。建议改用 sys.dm_io_cluster_shared_drives。
fn_virtualfilestats
public 角色的成员可以查看系统函数 fn_virtualfilestats 返回的数据。
权限更改:fn_virtualfilestats 要求用户对服务器具有 VIEW SERVER STATE 权限。
fn_virtualservernodes
public 角色的成员可以查看系统函数 fn_virtualservernodes 返回的数据。
权限更改:fn_virtualservernodes 要求用户对服务器具有 VIEW SERVER STATE 权限。
重要提示:
保留此 SQL Server 2000 系统函数是为了向后兼容。建议改用 sys.dm_os_cluster_nodes。
HOST_ID
HOST_ID 返回 char(8) 值。
HOST_ID 返回 char(10) 值。
索引
允许使用“SQL Server 2005 行为”列中介绍的索引。
由于 SQL Server 2005 中引入的更改,下列索引在升级过程中可能会被禁用或需要重新生成:
- 使用 CHECKSUM(some_timestamp_column) 的计算列的索引将被禁用,因为当 Transact-SQL CHECKSUM 函数将 timestamp 列作为参数时,它的行为发生了更改。
- 可能需要重新生成 nvarchar 或 nchar 列(使用基于土耳其语的排序规则)中包含字符值 0x3390、0x33ca 或 0x33cb 的索引,因为这些排序规则的排序行为已更改。
- 如果视图或计算列表达式包含从字符串到 datetime 或 smalldatetime 的隐式转换,或者包含从字符串到 datetime 或 smalldatetime 的显式不确定性转换,则对这种计算列或视图的索引将被禁用。
对于因上述前两项更改而需要重新生成的索引,请使用下列操作步骤。
检查 SQL Server 错误日志中的警告消息 3801、3803 或 3804。
对基础表运行 DBCC CHECKTABLE 以验证是否存在问题。
如果 DBCC 语句的结果指示有问题存在,请使用下列方法之一重新生成该索引:
- 带 REBUILD 子句的 ALTER INDEX 语句
- 带 DROP_EXISTING 子句的 CREATE INDEX
- DBCC DBREINDEX
使用下面的语句标识禁用的 FOREIGN KEY 约束:
SELECT * FROM sys.foreign_keys WHERE is_disabled=1;
使用 ALTER TABLE CHECK CONSTRAINT 语句启用任何 FOREIGN KEY 约束。
重新生成关联的索引时将启用 PRIMARY KEY 和 UNIQUE 约束。必须重新生成此索引,才能启用引用 PRIMARY KEY 或 UNIQUE 约束的 FOREIGN KEY 约束。
对于因上述第三项更改而禁用的索引,请使用下列操作步骤。
使用下面的语句来标识已禁用的计算列索引:
SELECT object_name(i.object_id) AS object_name, i.* FROM sys.indexes AS i JOIN sys.index_columns AS ic ON i.index_id = ic.index_id AND i.object_id = ic.object_id JOIN sys.computed_columns AS cc ON ic.object_id = cc.object_id AND ic.column_id = cc.column_id WHERE i.is_disabled = 1
对于计算列索引,请删除该索引,然后将计算列定义改为使用带有确定性日期格式的显式 CONVERT 函数。
对于索引视图,请删除该视图,然后使用带有确定性日期格式的显式 CONVERT 函数重新定义该视图。
重新创建已修改的计算列或视图的索引。
索引
SQL Server 2000 Developer Edition、SQL Server 2000 Standard Edition 和 SQL Server 2000 Enterprise Edition 中都支持并行索引操作。
创建、删除或重新生成索引的并行索引操作只可用在 SQL Server 2005 Developer Edition 和 SQL Server 2005 Enterprise Edition 中。
要从 SQL Server 2000 Standard Edition 升级到 SQL Server 2005 Standard Edition 的用户应了解创建、删除或重新生成索引的操作在 SQL Server 2005 Standard Edition 中是依次执行的,因此完成时间可能会稍长一些。
SELECT、INSERT、UPDATE 和 DELETE 语句不受影响。在 SQL Server 2005 Standard Edition 中,它们将并行操作。
升级到 SQL Server 2005 Standard Edition 后,请监视创建、删除或重新生成索引的操作。您可能需要调整维护脚本或计划的维护活动,以便有额外时间用于这些操作。
若要执行并行索引操作,请安装 SQL Server 2005 Enterprise Edition。
ORDER BY 子句
无论 ORDER BY 子句中的列名是否有限定,它们都将解析为选择列表中的列。
例如,以下查询执行时不会出现错误:
USE pubs
SELECT au_fname AS 'FName',
au_lname AS 'LName'
FROM authors a
ORDER BY a.LName
SQL Server 忽略 ORDER BY
子句中的限定符 a
并将列名 LName
解析为选择列表中的列。
限定的列名和别名解析为 FROM 子句中所列表中的列。如果 order_by_expression 未限定,则它必须在 SELECT 语句中列出的所有列中是唯一的。
例如,下面的等效查询将返回错误:
USE AdventureWorks
SELECT FirstName AS 'FName',
LastName AS 'LName'
FROM Person.Contact p
ORDER BY p.LName
SQL Server 不忽略 ORDER BY
子句中的限定符 p
,并将列名 LName
解析为 FROM
子句中列出的表中的列。但是 FROM
子句不认为列 LName
是表 p
的列别名。
SERVERPROPERTY 函数
SERVERPROPERTY 函数中的 ProductVersion 属性的返回类型是 varchar。
SERVERPROPERTY 函数中的 ProductVersion 属性的返回类型是 nvarchar。
sp_addtype
任何用户都可以执行 sp_addtype。
用户必须是 db_ddladmin 或 db_owner 数据库角色的成员才能执行 sp_addtype。
若要使用户可以创建别名数据类型,必须进行下列更改之一:
- 若要使用 sp_addtype,请将用户添加到 db_ddladmin 或 db_owner 数据库角色。
- 若要使用 CREATE TYPE 创建别名数据类型,请将 CREATE TYPE 权限授予用户并将 ALTER 权限授予目标架构上的用户。
sp_altermessage
sp_altermessage 可用于指定是否要将系统消息(消息 ID < 50000 的消息)写入 Windows 应用程序日志。
sp_altermessage 不能用于更改系统消息(消息 ID < 50000 的消息)的日志记录行为。若要审核系统消息,请使用 SQL 跟踪和 User Error Message 事件类。有关详细信息,请参阅SQL 跟踪简介。
sp_changedbowner
只有 sysadmin 固定服务器角色、db_owner 固定服务器角色的成员,或者同时为 db_ddladmin 和 db_securityadmin 固定数据库角色的成员才可以执行 sp_changeobjectowner。
由于具有 db_ddladmin 和 db_securityadmin 固定数据库角色的成员资格而可以执行此存储过程的用户还必须被授予安全对象的 CONTROL 权限。在不具有目标对象的 CONTROL 权限的情况下执行 sp_changeobjectowner 将导致执行失败并引发以下错误消息:
“消息 15247,级别 16,状态 1,过程 sp_changeobjectowner,第 17 行
用户没有执行此操作的权限。”
sp_help
sp_help 返回函数的一个结果集。
sp_help 返回函数的两个结果集。附加结果集是针对函数参数的。
sysindexes
保留 sys.sysindexes 是为了向后兼容。但是,SQL Server 2005 中的更改使视图不能完全向后兼容 SQL Server 的早期版本。
系统元数据
public 角色的成员可以查询系统表并显示目录中的元数据。
查询目录的用户只能查看某些对象的元数据行,这些对象或者是用户所拥有的,或者用户对其具有某种权限,这些对象还包括因用户具有某个角色的成员资格而有权查看的对象。有关详细信息和建议的纠正操作,请参阅元数据可见性配置和元数据可见性故障排除。
系统表
系统表的类型为“S”。
系统表已成为兼容性视图,其类型为“V”。查询系统表并包含搜索条件 type = 'S' 的语句将失败。
请将语句搜索条件改为 type = 'V'。
或
迁移到新的目录视图或动态管理视图。有关详细信息,请参阅将 SQL Server 2000 系统表映射到 SQL Server 2005 系统视图。
使用 bcp、BULK INSERT 或 OPENROWSET(BULK...) 大容量导入时的 TABLOCK
大容量导入到带有非空聚集索引的表中时,将忽略 TABLOCK 提示。
大容量导入到带有非空聚集索引的表中时,TABLOCK 提示可获取表的 X 锁。该行为阻止以并行方式大容量导入数据。如果您想在这种情况下执行并行大容量导入,则不要使用 TABLOCK。有关并行大容量加载的详细信息,请参阅优化大容量导入指南。
触发器
仅当触发器触发并执行可再次触发同一触发器的操作时,才会发生直接触发器递归。
在下列任一情况下,都会发生直接触发器递归:
- 触发器触发并执行可再次触发同一触发器的操作。
- 再次调用同一触发器,但在调用另一类型的触发器(AFTER 或 INSTEAD OF)之后。
当触发器触发并执行可以触发相同类型的另一触发器(AFTER 或 INSTEAD OF)的操作时,会发生间接递归。第二个触发器执行再次触发原始触发器的操作。
有关详细信息,请参阅使用嵌套触发器下的“递归触发器”部分。
触发器
在针对本地或分布式分区视图发出 UPDATE 或 DELETE 语句时,将触发在该视图的基表中定义的任何 UPDATE 或 DELETE 触发器。其中包括为不受更新或删除操作影响的表定义的触发器。
当针对分区视图发出 UPDATE 或 DELETE 语句时,仅当定义触发器的基表受更新或删除操作影响时才会触发 UPDATE 或 DELETE 触发器。有关详细信息,请参阅 DML 触发器执行。
UPDATE() 函数
UPDATE() 函数不检测对 timestamp 列的更改。对于这些列,触发器主体中的 IF UPDATE() 子句将返回 FALSE,而不考虑是否已更新列。
UPDATE() 函数检测对 timestamp 列的更改。对于这些列,如果它们已更新,则 DML 触发器正文中的 IF UPDATE() 子句将返回 TRUE。
用户定义函数
用户定义函数不能包含不确定性内置系统函数。
Transact-SQL 用户定义函数可包含大多数不确定性内置系统函数。有关允许的内置函数的完整列表,请参阅创建用户定义函数(数据库引擎)。
varchar、nvarchar 和 varbinary 数据类型
用作计算表列定义的零长度字符串或二进制值可创建类型为 varchar(0)、nvarchar(0) 或 varbinary(0) 的列。
用作计算表列定义的零长度字符串或二进制值可创建类型为 varchar(1)、nvarchar(1) 或 varbinary(1) 的列。这一行为更改只影响计算列的数据类型,而不影响计算值。
修改可对计算列数据类型的长度进行检查的应用程序,使 varchar 和 varbinary 列的最小长度为 1 个字节,nvarchar 列的最小长度为 2 个字节。
虚拟表访问
来宾或 public 角色的成员可以访问虚拟表。
访问虚拟表(如 sysprocesses)需要 VIEW SERVER STATE 权限和 SELECT 权限。
对视图的 WITH CHECK OPTION
允许对指定了 WITH CHECK OPTION 子句并且是对远程表创建的视图执行插入和更新操作,即使这些操作超出了视图的 SELECT 语句的范围。
对在远程数据源的表上创建的视图执行插入和更新操作时,SQL Server 2005 将确认 WITH CHECK OPTION 子句。
如果由于 WITH CHECK OPTION 子句而无法对在远程表上创建的视图执行插入和更新操作,而您不希望发生此行为,则应通过取消指定 WITH CHECK OPTION 子句来修改视图。
有关详细信息,请参阅 CREATE VIEW (Transact-SQL)、ALTER VIEW (Transact-SQL) 和通过视图修改数据。
xp_cmdshell
当 xp_cmdshell 的执行过程中出现错误时,将引发一个错误消息,但执行不会终止。
当 xp_cmdshell 的执行过程中出现错误时,将引发一个错误消息,而且执行会终止。
请参阅
参考
SQL Server 2005 中数据库引擎功能的重大更改
SQL Server 2005 中不推荐使用的数据库引擎功能
SQL Server 2005 中废弃的数据库引擎功能
其他资源
SQL Server 2005 数据库引擎的向后兼容性
sp_dbcmptlevel (Transact-SQL)
帮助和信息
更改历史记录
版本 | 历史记录 |
---|---|
2006 年 7 月 17 日 |
|
2005 年 12 月 5 日 |
|