昨天看了一下EntLib3中的模块Data部分时,看到一个script.有个系统存储过程票了一眼.sp_dboption的存储过程.这个是什么设置.
原来是配置数据库属性的.运行了一下exec sys.sp_dboption.有26个属性可以设置,当看到select into/bulkcopy的时候.很亲切,因为这个
属性用过好几次,想测试一下.这个按照msdn上的属性是阻止对数据库进行select into.
use master
exec sys.sp_dboption '数据库名','select into/bulkcopy',true/false
运行成功后,我测试了下面语句
use whtai
select * into sp7 from student where 1=2
奇怪,怎么可以通过,我已经false掉了.怎么还可以select into.没有道理啊.没办法.
看了一下系统的存储过程sys.sp_dboption.看了一下,怎么最后变成了.
ALTER DATABASE [whtai] SET RECOVERY simple WITH NO_WAIT
其中whtai是数据库名,simple 是恢复模式.在系统存储过程把参数中的true/false 变成了full/bulk_logged.
怎么跟看到的解释不一样.
接下来测试了一下.
数据库的恢复模式是simple .
运行
use master
exec sys.sp_dboption '数据库名','select into/bulkcopy',true/false
不起作用.
当我把数据库的恢复模式改为full.或者bulk_logged 的时候,起作用了.参数中的true,对应的恢复模式是full. false 对应bulk_logged
当我在msnd
http://technet.microsoft.com/zh-cn/library/ms188029.aspx
上看到into子句的解释时.这才了解:
SELECT...INTO 的日志记录量取决于对数据库有效的恢复模式。在简单恢复模式或大容量日志恢复模式下,大容量操作是最小日志记录操作。对于按最小方式记录日志,使用 SELECT… INTO 语句可能比创建一个表后使用 INSERT 语句填充该表效率更高。
下面的示例创建 dbo.NewProducts
表并从 Production.Product
表插入行。此示例假定 AdventureWorks
数据库的恢复模式设置为 FULL。若要确保最小方式记录,应在插入行之前将 AdventureWorks
数据库的恢复模式设置为 BULK_LOGGED,并在 SELECT...INTO 语句后重置为 FULL。此过程确保 SELECT...INTO 语句在事务日志中占用最少的空间并且高效执行。
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks SET RECOVERY BULK_LOGGED;
GO
SELECT * INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks SET RECOVERY FULL;
GO
这是msdn上的一个例子.通过例子我们看到select into/bulkcopy是设置恢复模式的.通过设置数据库的恢复模式,使得在使用
select into 语句的时候.事务的日志量达到最少.
可是有没有这样的设定,限制对一个数据库进行 select into .期待高手回复.