sp_dboption [<dbname>, <optname>, <optvalue>[, <dockpt>]]
<dbname>
是要在其中设置选项的数据库的名称。必须使用 master 来执行带参数的 sp_dboption(即更改数据库选项)。但是,您不能更改 master 数据库中的选项设置。
<optname>
是要设置的选项的名称。SAP ASE 服务器可以识别属于选项名称一部分的任何唯一字符串。如果选项名是关键字或含有嵌入的空格或标点符号,则请用引号将选项名引起来。
可以一次打开多个数据库选项。不能在用户定义的事务中更改数据库选项。
<optvalue>
是设置的值。true 将打开该选项,false 将关闭该选项。
<dockpt>
指定 sp_dboption 是否对 <dbname> 执行 checkpoint 命令。缺省值为 1,表示自动执行 checkpoint。可以通过手动执行 checkpoint 命令来对 <dbname> 运行 checkpoint。
显示数据库选项列表:
sp_dboption
Settable database options
database_options
------------------------
abort on low memory
abort tran on log full
allow incremental dumps
allow nulls by default
allow wide dol rows
async log service
auto identity
auto imrs partition tuning
dbo use only
ddl in tran
deallocate first text page
deferred table allocation
delayed commit
enforce dump tran sequence
erase residual data
full logging for all
full logging for alter table
full logging for reorg rebuild
full logging for select into
identity in nonunique index
no chkpt on recovery
no free space acctg
read only
scratch database
select into/bulkcopy/pllsort
single user
trunc log on chkpt
trunc. log on chkpt.
unique auto_identity index
将数据库 pubs2 设置为只读:
1> use pubs2
2> go
1> master..sp_dboption pubs2, "read", true
2> go
Database option 'read only' turned ON for database 'pubs2'.
Running CHECKPOINT on database 'pubs2' for option 'read only' to take effect.
(return status = 0)
read 字符串在所有可用数据库选项中唯一确定 read only 选项。请注意,应使用引号将关键字 read 引起来。
使数据库 pubs2 重新变为可写,但通过为 <dockpt> 选项指定 0,您可以看到消息 “Run the CHECKPOINT command in the database that was changed”:
1> use pubs2
2> go
1> master..sp_dboption pubs2, "read", false, 0
2> go
Database option 'read only' turned OFF for database 'pubs2'.
Run the CHECKPOINT command in the database that was changed.
(return status = 0)
若要在 pubs2 上手动执行检查点,请输入:
1> checkpoint
2> go
允许对 pubs2 中的表进行 select into、bcp 和并行排序操作。select into 字符串在所有可用数据库选项中唯一确定 select into/bulkcopy 选项:
use pubs2
go
master..sp_dboption pubs2, "select into", true
go
⚠️
因为有嵌入的空格,所以需要用引号将选项引起来。
自动在 mydb 中创建的新表中定义 10 位的 IDENTITY 列。如果在创建新表时未指定主键、unique 约束或 IDENTITY 列,则将在每个这样的新表中定义 IDENTITY 列 SYB_IDENTITY_COL:
use mydb
go
master..sp_dboption mydb, "auto identity", true
go
自动在 mydb 表的索引键中包括 IDENTITY 列,但前提条件是这些表已经具有了 IDENTITY 列。在表上创建的所有索引都是内部唯一的:
use master
go
sp_dboption mydb, "identity in nonunique index", true
go
use mydb
go
自动为 pubs2 中的新表包括带有唯一非聚簇索引的 IDENTITY 列:
use master
go
sp_dboption pubs2, "unique auto_identity index", true
go
use pubs2
go
在指定的数据库中设置异步日志服务 (ALS),启用用户日志高速缓存和日志写入器线程。
sp_dboption "mydb", "async log service", true
use mydb
在指定的数据库中禁用 ALS:
sp_dboption "mydb", "async log service", false
use mydb
对 big_db 强制执行转储事务序列:
sp_dboption 'big_db', 'enforce dump tran sequence',
true
在 mydb 中对 select into 和 alter table 启用完全日志记录:
create database 命令创建 mydb:
create database mydb on datadev=20 log on logdev=10
go
CREATE DATABASE: allocating 10240 logical pages (20.0 megabytes) on disk
'datadev' (10240 logical pages requested).
CREATE DATABASE: allocating 5120 logical pages (10.0 megabytes) on disk
'logdev' (5120 logical pages requested).
Database 'mydb' is now online.
在 mydb 中对 select into 启用完全日志记录选项:
sp_dboption "mydb", "full logging for select into", "true"
go
Database option 'full logging for select into' turned ON for database
'mydb'.
Running CHECKPOINT on database 'mydb' for option 'full logging for select
into' to take effect.
(return status = 0)
在 mydb 中对 alter table 启用完全日志记录选项:
sp_dboption "mydb", "full logging for alter table", "true"
go
Database option 'full logging for alter table' turned ON for database
'mydb'.
Running CHECKPOINT on database 'mydb' for option 'full logging for alter
table' to take effect.
(return status = 0)
运行 sp_helpdb 可显示 mydb 的设置:
sp_helpdb mydb
go
name db_size owner dbid created durability status
---- ------- ----- ---- ------------ --------- -----------------------
mydb 30.0 MB sa 5 Dec 16, 2010 full full logging for select
into/alter table
(1 row affected)
device_fragments size usage created free kbytes
----------------- ------- ---------- ------------------- --------------
datadev 20.0 MB data only Dec 16 2010 6:08PM 18696
logdev 10.0 MB log only Dec 16 2010 6:08PM not applicable
--------------------------------------------------------------
log only free kbytes = 10184
(return status = 0)
1>
启用累计转储的备份和恢复:
sp_dboption mydb, "allow incremental dumps", true
对 pubs2 启用延迟表创建:
sp_dboption pubs2, "deferred table allocation", true
对于这两个示例,启用在数据库级别删除残留数据的语法为:
sp_dboption <dbname>, "erase residual data", true
第一个示例使用以下两个表:
create table t1 (col1 int) with erase residual data on
create table t2 (col1 int) with erase residual data off
⚠️
sp_dboption 过程要求对 “erase residual data” 使用引号,但 create table … with erase residual data on | off 不使用引号。对 create table 使用引号会造成语法错误。
由于删除残留数据的选项是在数据库级别设置的,因此对于表 t1 该选项为启用,所以对 t1 执行 drop table 和 truncate table 命令都会导致清除其页面中的所有残留数据。
但是,由于创建表 t2 时使用了了 erase residual data off 子句,所以其 erase residual data 选项为显示禁用。即使在数据库级别将“erase residual data”选项设置为 true,也不会删除残留数据。因此,即使在对 t2 表运行 drop table 和 truncate table 后,残留数据仍将保留:
create database db1
go
sp_dboption db1, "erase residual data", true
go
use db1
go
create table t1 (col int)
go
insert t1 values ...
go
create table t2 (col1 int, col2 char(10)) with erase residual data off
go
truncate table t1
go
drop table t1
go
truncate table t2
go
drop table t2
go
第二个示例使用以下语法:
create database db1
go
use db1
go
create table t1 (col int)
go
sp_dboption db1, "erase residual data", true
go
create table t2 (col1 int, col2 char(10))
go
create table t3 (col1 int, col2 char(10)) with erase residual data off
go
truncate table t1
go
truncate table t2
go
truncate table t3
go
表 t1 未显式设置 erase residual data off,但是在数据库级别进行了设置,因此在运行 truncate table t1 时会删除 t1 中的残留数据。
表 t2 设置为 erase residual data,因为该选项是在数据库级别设置的。因此,运行 truncate table t2 时将删除 t2 中的残留数据。
表 t3 显式标记为 erase residual data off,因此即使 sp_dboption 将“erase residual data”设置为 true,SAP ASE 运行 truncate table t3 时也不会删除残留数据。
在 NULL 更新后释放第一个文本页:
sp_dboption mydb, "deallocate first text page", true
配置自动显示并为启用 IMRS 的表重新启用 IMRS 使用。
sp_dboption mydb, "auto imrs partition tuning", true
<optname> 输入了一个不明确的值,则会显示一条错误消息。例如,两个数据库选项分别为 dbo use only 和 read only。使用“only”作为 <optname> 参数的值将产生一条消息,因为它与两个名称都匹配。将显示与所给的字符串匹配的完整名称,以便可以查看如何使 i<optname> 更具体。
另请参见:
a 在启用 IMRS 的表上使用 sp_dboption。
b 有时,在未提高性能的情况下,启用 IMRS 的表会消耗大量的行存储高速缓存。启用 auto imrs partition tuning 时,服务器从内部监控对数据的事务工作量访问,并禁用它们的行存储使用。但是,禁用行存储使用可稍后通过使用行存储优化。服务器监控这些情况,如果发现通过在行存储中存储数据而提高工作量性能,则可重新启用行存储使用。
c 例如,极少更新的表可能最初在行存储中装载数据。但是,由于表很少更新,因此这样做可能不会提高性能,反而浪费分区的行存储高速缓存。启用 auto imrs partition tuning 时,服务器禁用分区上的这些更新的行存储使用。
sp_imrs 'show', 'effectiveness', 'imrscache'
CacheName DBName ObjectName PartitionName DisabledRowTypes
--------- --------- --------- ------------------ ------------------
imrscache mydb t1 p1 Migrated
缺省情况下,select into、某些类型的 alter table 和 reorg rebuild 在最少日志记录模式下运行。在执行这些命令之前,首先将 select into/bulk copy 数据库选项设置为 true,以便 SAP ASE 服务器能够中断转储序列,即执行防止有能力使用 dump transaction 的操作。
使用 full logging for [select into | alter table | reorg rebuild | all] 参数时,该命令会在完全日志记录模式下运行。先前设置的任何 select into/bulk copy 值均与目前在完全日志记录模式下运行的命令无关。
不支持对快速 bcp 和并行排序启用完全日志记录,除非将 select into/bulk copy 设置为 true,否则无法执行完全日志记录。
将操作设置为在完全日志记录模式下运行之后,便可像执行其它完全日志记录操作那样对这些操作运行 dump transaction/load transaction 命令以及进行恢复。
以下是对缺省情况下以最少日志记录模式运行的命令执行完全日志记录的语法:
sp_dboption <dbname>, "full logging for
[select into | alter table | reorg rebuild | all]",
true | false
其中:
full logging for select into – 要使 select into proxy table 在完全日志记录模式下运行,请在托管实际表的远程服务器上将“full logging for select into”选项设置为 true。如果在托管实际表的服务器上将 full logging for select into 选项设置为 false,该命令将在此数据库中以最少日志记录模式执行,并且转储事务序列将中断。
pll create index – 在并行排序结束后启用完全日志记录。在循环分区表上创建聚簇索引时需要并行排序。
full logging for alter table – 对以下需要数据移动的这些 alter table 版本启用完全日志记录:
</li></ul><ul><li><code>alter table add <column> not null
alter table drop <column> not null
alter table modify <datatype> of not null <column>
alter table partition
alter table 的其它变体已在完全日志记录模式下执行。
⚠️
如果通过 alter table lock 在全页锁定表与数据页锁定表/数据行锁定表这些锁定方案之间进行切换,则需要移动数据,但 full logging for alter table 不支持此行为。
full logging for all – 启用上述所有完全日志记录选项。将 all 设置为 false 会禁用所有完全日志记录选项。
⚠️
该语法要求您指定要对哪些内容进行完全记录;“full logging”本身并不是有效的选项。
无论使用哪个 full logging for 选项,该命令均会在完全日志记录模式下运行。先前设置的任何 select into/bulk copy/pllsort 值均与目前在完全日志记录模式下运行的命令无关。不支持对快速 bcp 和并行排序启用完全日志记录,除非将 select into/bulk copy/pllsort 设置为 true,否则无法执行完全日志记录。
将操作设置为在完全日志记录模式下运行之后,便可像执行其它完全日志记录操作那样对这些操作运行 dump transaction/load transaction 命令以及进行恢复。
dboption 是“full logging for all”,不只是“full logging”本身。
⚠️
执行在完全日志记录模式下运行的 select into、alter table 或 reorg rebuild 命令可能需要大量的日志空间来保存事务日志。
如果在启用完全日志记录时发出 select into、alter table 和 reorg rebuild 命令,日志空间的需求将会大大增加,特别是大表。您可能需要增大日志大小。完成命令后,可以使用 alter database log off 命令移除额外的日志空间。
在下列数据库中不能为 select into、alter database 或 reorg rebuild 设置完全日志记录:
可更改下列数据库的设置:
包含混合日志和数据段的任何数据库;但只有在将数据库变更为不再包含混合日志和数据段后,才会忽略此选项。
不具有完全持久性级别的数据库;但只有在将数据库变更为具有完全持久性后,才会忽略此选项。
因为所有数据库都不允许执行 dump transaction 命令,所以上述限制均适用。使用可完全恢复的 DDL 时会启用 dump transaction。
allow wide dol rows 将数据库配置为允许宽的、可变长度的仅数据锁定(DOL)行。
启用 async log service (ALS) 将使 SAP ASE 服务器具有更大的可伸缩性,从而可以为高端均衡多处理器系统的记录子系统提供更高的吞吐量。
enforce dump tran sequence 阻止运行会禁止后续转储事务的操作。
仅当数据库满足以下条件时,才能将此选项设置为 true:
a 执行了部分日志记录更新,例如,执行 select into、alter table modify、reorg rebuild、fast bcp 和 writetext。
b 事务日志已截断。
c 数据库是新创建或升级的数据库。
如果数据库选项 enforce dump tran sequence 为 true,则不能执行以下操作:
使用 sp_dboption 数据库选项时还存在一些其它注意事项。
不能使用 allow nulls by default 在 select into 语句中更改列的可空性。而应使用 convert 指定结果列的可空性。
若要设置自动 IDENTITY 列的精度,请使用 size of auto identity column 配置参数。
尽管可以在 tempdb 中将 auto identity 设置为 true,但其并不被承认和使用,且在该数据库中创建的临时表也不会自动包括 IDENTITY 列。
若要得到有关包含 IDENTITY 列的特定表中索引的报告,请执行 sp_helpindex。
警告
数据定义语言(DDL)命令在系统表(例如 sysobjects)上持有锁。应避免在事务中使用它们;如果必须使用的话,请保持事务尽量简短。
在事务中对 tempdb 使用任何 DDL 命令可能导致系统速度减慢甚至挂起。始终将 tempdb 中的 ddl in tran 设置为 false。
alter table – 允许使用除 partition 和 unpartition 之外的子句
create default
create index
create procedure
create rule
create schema
create table
create trigger
create view
drop default
drop index
drop procedure
drop rule
drop table
drop trigger
drop view
grant
revoke
alter table
alter table...lock
alter table...partition
alter table...unpartition
create database
disk init
dump database
dump transaction
drop database
load database
load transaction
select into
truncate table
update statistics
另外,不能在用户定义的事务中使用创建临时表或更改 master 数据库的系统过程。
表必须已经具有 IDENTITY 列,identity in nonunique index 选项才能工作。IDENTITY 列可用 create table 语句或在创建表之前通过将 auto identity 数据库选项设置为 true 来创建。
通过 identity in nonunique index 在具有非唯一索引的表上使用游标和隔离级别 0 读取。唯一索引可确保下一次对该游标执行 fetch 时,游标定位于正确的行。如果打算在具有唯一索引和任何隔离级别的表上使用游标,则最好使用 unique auto_identity index 选项。
不要将 identity in nonunique index 选项与 unique auto_identity index 混淆,后者用于向新表添加具有唯一非聚簇索引的 IDENTITY 列。
若要得到有关包含 IDENTITY 列的特定表中索引的报告,请执行 sp_helpindex。
如果将此选项设置为 false(关闭)(缺省状态),则当重新启动 SAP ASE 服务器时,在数据库恢复之后会向其添加一个检查点记录。此检查点可以确保您不用不必要地再次运行恢复机制,并且可以更改序列号,从而使主数据库中对事务日志随后进行的装载失败。
如果将辅助数据库的此选项设置为 true(打开),则可以防止从恢复进程中取得检查点,从而保证主数据库中随后的事务日志转储能够被装载到其中。
a 使用 writetext 实用程序。
b 对永久表执行 selectinto。
c 使用 bcp 执行“快速”批量复制。缺省情况下,快速 bcp 用于没有索引的表。
d 执行并行排序。
事务日志转储不能恢复这些最低限度记录的操作,因此禁止对转储设备执行 dump transaction。但是,仍可以使用 dump transaction...with no_log 和 dump transaction...with truncate_only。在执行不在记录范围内的操作后,请将 select into/bulk copy/pllsort 设置为 false(关闭)并发出 dump database。
在使用 select into、批量复制或并行排序对数据库进行了未记录的更改之后发出 dump transaction 语句将产生一条错误消息,指出应使用 dump database。(writetext 命令没有这样的保护。)
因为从不恢复 tempdb,所以对临时表执行 select into 时无需将 select into/bulkcopy/pllsort 选项设置为 true。不必为在带有索引的表上运行 bcp 而将该选项设置为 true,这是因为带有索引的表始终采用较慢形式的批量复制进行复制,而且将记录日志。
设置 select into/bulkcopy/pllsort 不会阻塞日志转储,但对数据进行的最小记录的更改会阻塞常规 dump transaction 的使用。
缺省情况下,在新创建的数据库中 select into/bulkcopy/pllsort 被关闭。若要更改该缺省设置,请在 model 数据库中打开此选项。
不能在存储过程的用户数据库中或当用户已打开数据库时将 single user 设置为 true。不能将 tempdb 的 single user 设置为 true。
当 trunc log on chkpt 选项打开时,因为不能使用截断的事务日志转储从介质故障中恢复,所以禁止对转储设备执行 dump transaction。如果发出 dump transaction 语句,则会产生一条错误消息,指出应使用 dump database。
在新创建的数据库中 trunc log on chkpt 被关闭。若要更改该缺省设置,请在 model 数据库中打开此选项。
警告
如果在 model 中将 trunc log on chkpt 设置为打开,而且需要将一组数据库和事务日志装载到一个新创建的数据库中,则一定要在新数据库中关闭该选项。
如果需要使用游标或具有非唯一索引的隔离级别 0 读取,请使用 identity in nonunique index 选项。
尽管可以在 tempdb 中将 unique auto_identity index 设置为 true,但其并不被承认和使用,且在该数据库中创建的临时表也不会自动包括 IDENTITY 列。
unique auto_identity index 选项提供一种机制,可用来创建具有自动 IDENTITY 列的表,这种列具有可与可更新游标一起使用的唯一索引。表的唯一索引可确保在 fetch 后游标位于正确的行。(如果正在使用隔离级别 0 读取且需要使非唯一索引在内部逻辑上唯一,以便它们可以处理可更新的游标,可使用 identity in nonunique index 选项。)
在某些情况下,unique auto_identity index 选项可避免以下原因引起的 Halloween 问题:
a 用户不能更新 IDENTITY 列;因此它不能用于游标更新。
b 自动创建了具有唯一非聚簇索引的 IDENTITY 列,以便将其用于可更新的游标扫描中。
有关 Halloween 问题、IDENTITY 列和游标的详细信息,请参见《Transact-SQL 用户指南》>“游标:访问数据”和“性能和调优系列:查询处理和抽象计划”>“游标优化”。
不要将 unique auto_identity index 选项与 identity in nonunique index 选项混淆,后者用于通过在表的索引键中包括 IDENTITY 列来使表中的所有索引具有唯一性。
设置 sp_dboption ... abort on low memory 选项可以让您避免丢失事务。
设置 sp_dboption ... abort on low memory 为:
缺省值设置为:
在数据库中创建启用快照隔离的表将自动把 abort on low memory 更改为 false。但是,从数据库中删除最后一个启用快照隔离的表则不会把 abort on low memory 的 false 值更改为 true。您必须手动更改该选项。