AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 223425
Accepted
Lika
Lika
Asked: 2018-11-27 02:18:48 +0800 CST2018-11-27 02:18:48 +0800 CST 2018-11-27 02:18:48 +0800 CST

如何测试查询

  • 772

我想运行一个查询,但只是为了测试它并有可能回到我看到回滚事务的先前状态。

我之前必须运行这个命令吗?

delete * from myTables
where colName = "***"
sql-server rollback
  • 4 4 个回答
  • 6653 Views

4 个回答

  • Voted
  1. sepupic
    2018-11-27T02:33:06+08:002018-11-27T02:33:06+08:00

    你确定你在使用SQL Server?的正确语法delete应该如下所示:

    delete from myTables
    where colName = '***'
    

    要测试您根本不需要deletesmth 的结果,您可以使用适当select的 ,您的问题select将是这个:

    select *
    from myTables
    where colName <> '***'
    

    虽然在测试环境中对一个有 10 行的表begin tran执行 adelete和 then可能不是问题rollback,但在大量数据或并发环境中可能是一个问题,在没有onlock的情况下你的表,并且(及其)将产生很多,因为在任何恢复模型中。indexcolnamedeleterollbacktransaction logdeletefully logged operation

    • 2
  2. Best Answer
    Randi Vertongen
    2018-11-27T02:29:02+08:002018-11-27T02:29:02+08:00

    是的,您可以使用它BEGIN TRANSACTION ... ROLLBACK TRANSACTION来检查某些查询。

    我将双引号 ( ") 更改为有效的单引号或撇号 ( '),并将delete *更改为仅delete与 SQL Server 语法匹配。

    CREATE TABLE mytables(id INT identity(1,1) ,colName NVARCHAR(255));
    INSERT INTO mytables(colName)
    VALUES('***');
    INSERT INTO mytables(colName)
    VALUES('bla');
    
    BEGIN TRANSACTION
    DELETE FROM myTables
    WHERE colName = '***';
    SELECT * FROM myTables; -- Result #1
    ROLLBACK TRANSACTION
    
    SELECT * FROM myTables; -- Result #2
    

    结果#1

    id  colName
    2   bla
    

    结果#2

    id  colName
    1   ***
    2   bla
    

    但是,对于在大表上发出删除的风险,sepupic 是完全正确的。如果我想测试我是否需要确切地知道删除需要多长时间,包括日志记录,我只会这样做。在大多数情况下,选择更适合测试目的。

    • 1
  3. Bendom
    2018-11-27T02:35:58+08:002018-11-27T02:35:58+08:00

    如果您只想查看受影响的记录更改删除以选择并检查输出。如果你想使用事务,确保你的数据库中没有设置自动提交(只是为了确定)。然后根据您使用的 SQL 引擎,它将类似于

    begin transaction
    delete from t1 where attribute1 = 'xy'
    select * from t1
    
    -- commit 
    OR
    --rollback
    

    如果您对结果类型提交确认事务没问题,如果不回滚事务。如果您正在玩这样的事情,请始终在非生产数据库上进行。

    • 1
  4. David Spillett
    2018-11-27T02:38:18+08:002018-11-27T02:38:18+08:00

    一旦提交了事务,您就无法回滚事务,因此您无法运行它并在一段时间后改变主意。在正确运行它们之前,我有时会使用这种模式来测试 SSMS 中的临时更新语句的结果:

    BEGIN TRANSACTION
    SET XACT_ABORT OFF
    GO
    -- statements to test the current state of the data for instance
    SELECT COUNT(*) FROM TableThatShouldBeEmpty
    -- statements to update data
    DELETE TableThatShouldBeEmpty
    -- statements to test the current state of the data after the changes
    SELECT COUNT(*) FROM TableThatShouldBeEmpty
    GO
    ROLLBACK TRANSACTION
    

    一旦您对结果感到满意,就会更改ROLLBACK为COMMIT.

    不过,这远非 100% 安全:

    不过,在生产或共享开发/测试/其他实例中仍然要非常小心:长时间运行的更新仍会消耗资源(IO、CPU、内存),因此可能会减慢其他用户的速度,并且会根据需要持有锁,因此您仍然可以导致您的数据更改语句通常会出现的延迟和其他问题(可能是死锁)。

    如果您正在测试的代码调用其他可能导致您的事务回滚的过程并且不包括额外的批处理(额外GO的),您可能会发现调用的过程会杀死事务但下一个批处理运行时没有影响您的事务,ROLLBACK因此您的某些测试最终会永久应用而不是回滚。

    与往常一样,如果您可以在单独的环境中进行测试,那将更加安全。

    为了能够在事务提交后回滚,您需要先进行备份,并且您的回滚计划是从中恢复数据库。不幸的是,这也会回滚所有其他活动,因此它可能不适合共享或生产环境。

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve