what can we do if just only want to truncate transaction log without backup ?

本文介绍了一种在不更改数据库恢复模式的情况下,直接截断SQL Server交易日志的方法。通过存储过程实现,适用于各种现有数据库及恢复模式。文章提供了具体的T-SQL脚本,帮助用户释放交易日志空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

In some circumstances,  we just want to truncate transaction log without backup and refuce change database mode to "Simple".

You may want to say "You are make an unnecessary move". 

Yes, that is true.  However,. our customer just want to keep current setting and release transaction log usage and also refuse to backup them.

 

Here we can go to solve the problem:

 

You just can exec that procedure what ever your exist databases and their recover mode are.

 

 

 

CREATE PROCEDURE [dbo].[truncatetlog]

AS

BEGIN

 

 

DECLARE @m int

DECLARE @n int

DECLARE @SQL VARCHAR(MAX)

DECLARE @SQL2 VARCHAR(MAX)

DECLARE @SQL3 VARCHAR(MAX)

DECLARE @SQL4 VARCHAR(MAX)

DECLARE @SQL5 VARCHAR(2)

--DECLARE @SQL5 VARCHAR(MAX)

DECLARE @createtable VARCHAR(MAX)

DECLARE @createtable2 VARCHAR(MAX)

DECLARE @createtable3 VARCHAR(MAX)

DECLARE @createtable4 VARCHAR(MAX)

--DECLARE @droptableList TABLE (id int IDENTITY(1,1) NOT NULL,contents nvarchar(MAX) NOT NULL)

DECLARE @droptableList TABLE (databaseid int ,name nvarchar(MAX) ,logfile_name nvarchar(MAX),recovery_model_desc  nvarchar(MAX))

 

 

SET NOCOUNT ON

SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

SET ANSI_PADDING ON

 

 

set @m=(SELECT MAX(database_id) from sys.databases where database_id >4)

 

 

set @n=5

--

 

 

while @n<=@m

begin

 

 

INSERT @droptableList (databaseid,name,recovery_model_desc) select database_id,name,recovery_model_desc from sys.databases where database_id = @n

update @droptableList set logfile_name = ( select name from sys.database_files where type=1 )where  databaseid = @n

 

 

SELECT @SQL = (SELECT name from @droptableList where databaseid=@n)

SELECT @SQL2 = (SELECT logfile_name from @droptableList where databaseid=@n)

SELECT @SQL3 = (SELECT recovery_model_desc from @droptableList where databaseid=@n)

SELECT @SQL4 = 'checkpoint'

 

 

set @createtable4='use ['+@SQL+'];'

exec(@createtable4)

 

 

--print @createtable4

 

 

set @createtable='ALTER DATABASE ['+@SQL+']  SET RECOVERY SIMPLE;'

exec(@createtable)

--print @createtable

 

 

set @createtable2='DBCC SHRINKFILE (N''' + @SQL2 + ''',50,TRUNCATEONLY);'

--print @SQL4

exec(@SQL4)

exec(@createtable2)

--print @createtable2

 

 

set @createtable3='ALTER DATABASE ['+@SQL+']  SET RECOVERY ' +@SQL3 +';'

exec(@createtable3)

--print @createtable3

 

 

set @n=@n+1

end

 

 

END

 

 

if that successed ?. just  execute them,  you also can make an schedule on it.  Then that id  OK

### 事务提交行为与SQL语句的关系 在SQL Server中,某些操作会隐式提交当前事务。这意味着即使没有显式调用 `COMMIT`,这些操作也会自动结束当前事务并提交更改。理解哪些操作具有这种行为对于控制事务边界和确保数据一致性至关重要。 #### 自动提交模式下的事务行为 SQL Server默认运行在**自动提交事务模式**下,在该模式中,每个独立的T-SQL语句都会被视为一个单独的事务,并在其执行完成后立即提交或回滚(如果出现错误)[^2]。例如: ```sql -- 在自动提交模式下,每条INSERT语句都是一个独立事务 INSERT INTO Employees (Name, Position) VALUES ('Alice', 'Engineer'); ``` 在这种情况下,如果插入成功,则事务自动提交;如果失败,则事务自动回滚。开发人员无法对这类事务进行显式控制,因此不适合处理需要多条语句一致性的复杂业务逻辑。 #### 隐式事务模式中的行为 当启用**隐式事务模式**时,SQL Server会在没有现有事务的情况下开始一个新的事务,但不会自动提交或回滚该事务。必须通过显式的 `COMMIT` 或 `ROLLBACK` 来结束事务[^1]。例如: ```sql -- 启用隐式事务 SET IMPLICIT_TRANSACTIONS ON; -- 开始一个事务 INSERT INTO Orders (OrderNo, CustomerID) VALUES ('ORD001', 1001); -- 修改订单状态 UPDATE Orders SET Status = 'Processed' WHERE OrderNo = 'ORD001'; -- 提交事务 COMMIT; ``` 在此模式下,所有DML操作(如 `INSERT`、`UPDATE`、`DELETE`)都不会自动提交事务,直到显式调用 `COMMIT` 或 `ROLLBACK`。 #### DDL语句对事务的影响 某些DDL(数据定义语言)操作具有隐式提交事务的行为。例如,`CREATE TABLE`、`ALTER TABLE` 和 `DROP TABLE` 等语句通常会导致当前事务被提交,因为它们涉及数据库结构的变更,而这类变更不能回滚到事务未提交的状态。例如: ```sql BEGIN TRANSACTION; CREATE TABLE TempTable (ID INT); -- CREATE TABLE 会隐式提交事务 COMMIT; -- 此处可能报错,因为事务已经被提交 ``` #### TRUNCATE 与事务提交 尽管 `TRUNCATE` 是一种用于清空表数据的操作,但它本质上属于DDL语句,而不是DML语句。由于其底层实现机制涉及对表结构的操作(如重置自增长字段),`TRUNCATE` 会隐式提交当前事务。例如: ```sql BEGIN TRANSACTION; TRUNCATE TABLE Orders; -- TRUNCATE 会隐式提交事务 ROLLBACK; -- 此处无效,TRUNCATE 已经提交了事务 ``` 相比之下,`DELETE FROM Orders` 是一个典型的DML操作,它可以在事务中回滚,前提是事务尚未提交。 #### SELECT 与事务提交 `SELECT` 操作通常不会导致事务提交,它只是读取数据而不修改任何内容。但在某些特定场景下(如使用 `SELECT INTO` 创建新表),可能会触发隐式提交事务的行为。例如: ```sql BEGIN TRANSACTION; SELECT * INTO NewTable FROM OldTable; -- SELECT INTO 会隐式提交事务 ROLLBACK; -- 此处无效,事务已经被提交 ``` --- ### 总结:哪些SQL语句会隐式提交事务? | SQL语句类型 | 是否隐式提交事务 | 说明 | |-------------|------------------|------| | `CREATE` | 是 | 属于DDL语句,创建数据库对象时会隐式提交事务 | | `ALTER` | 是 | 修改数据库对象结构时会隐式提交事务 | | `DROP` | 是 | 删除数据库对象时会隐式提交事务 | | `TRUNCATE` | 是 | 虽然功能上类似删除数据,但属于DDL语句,会隐式提交事务 | | `INSERT` | 否 | 属于DML语句,不会隐式提交事务(除非在自动提交模式下) | | `UPDATE` | 否 | 属于DML语句,不会隐式提交事务(除非在自动提交模式下) | | `DELETE` | 否 | 属于DML语句,不会隐式提交事务(除非在自动提交模式下) | | `SELECT` | 否 | 一般不会提交事务,除非使用 `SELECT INTO` 等特殊语法 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值