-3

我有一个问题要解决,它需要对 Oracle 数据库中每个已执行的 sql 文件进行撤消操作。

我使用 MSBuild 在 xml 文件中执行它们 - 使用登录和 @*.sql 执行命令 sqlplus。

显然回滚是不行的,因为它不能回滚已经提交的事务。

我已经搜索了几天,仍然找不到答案。我学到的是 Oracle 闪回和时间点恢复。问题是我希望仅对当前用户撤消更改,即如果另一个用户同时进行了一些更改,那么我的解决方案仅对用户' X '而不是' Y '执行撤消。

我在 flashback_transaction_query 中找到了 start_scn 和 commit_scn。但它是否只识别一个用户?如果我闪回到给定的SCN怎么办?是否只会为我或其他用户撤消?我已经拿出

从 flashback_transaction_query 中选择 start_scn WHERE logon_user='MY_USER_NAME'

WHERE table_name = "MY_TABLE NAME"

并执行

闪回 SCN"这里是它的编号"

在所选操作的 SCN 上。这对我有用吗?

我还发现了有关时间点恢复的信息,但是当我阅读它时,它会使整个数据库不可用,因此其他用户将无法使用它。

所以我需要一些可以撤销整个 *.sql 文件的东西。

4

2 回答 2

0

这是可能的,但可能不适用于您使用的工具。sqlplus可以回滚您的事务,您只需确保未启用自动提交,并且您的脚本commit在结束 sqlplus 会话之前仅包含一个权限(如果您根本不提交,sqlplus 将始终回滚所有更改它退出)。

当您有多个脚本并且想要回滚昨天运行的脚本时,问题就开始了。这是一个全新的蠕虫罐头,没有通用的解决方案总是有效的(它是“合并问题”组问题的一部分,即当每个人都可以保持交易开放时,如何合并不同用户的交易只要他们喜欢)。

可以这样做,但是您需要为此仔细设计数据库,业务规则必须可以接受,等等。

一般的方法是有一个表,其中包含脚本修改(=创建、更新、删除)的行的信息,加上脚本名称加上执行时间。

使用此信息,您可以生成 SQL,该 SQL 可以撤消脚本创建的更改。要填充这样的表,请使用触发器或生成脚本,以便它们也写入此信息(注意:这可能超出了“简单”的 sqlplus 解决方案;您必须为此编写自己的数据加载器)。

于 2013-01-14T14:17:48.987 回答
0

好的,我通过创建 DDL 和 DML TRIGGER 解决了这个问题。第一个从 v$open_cursor 获取“额外”列(这是您刚刚输入的 DDL 语句)并插入到我的表中。第二个从 flashback_transaction_query 获取“undo_sql”,这是您的 DML 操作的相反操作 - 如果 INSERT 则 undo_sql 删除所有必要的数据。

触发器在特定表上的 DELETE、INSERT (DML) 和特定 SCHEMA 或 VIEW 上的 ALTER、DROP、CREATE (DDL) 之前工作。

于 2013-02-04T13:48:47.830 回答