
你每个命令带一个事务,其实跟没有事务是一样的,不成功是没有回滚的。
START TRANSACTION;
INSERT INTO `guwitest``cdn` (`id`, `operatorId`, `type`, `distributionTarget`, `distributionName`, `distributionDomain`, `status`) VALUES ('1', '1', 'cloudfront', 'metadata', '1', '1', '0');
create table guwitestaa(id int(10) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id));
ROLLBACK;
触发器
触发器的定义就是说某个条件成立的时候,你触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。
然后,触发器的触发条件其实在你定义的时候就已经设定好的了。这里面需要说明一下,触发器可以分为语句级触发器和行级触发器。详细的介绍可以参考网上的资料,简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发。而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次。
具体举例:
1 在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的 *** 作过程。这个就是删除表的 *** 作就是触发器执行的条件了。
2 在一个表中定义了行级的触发器,那当这个表中一行数据发生变化的时候,比如删除了一行记录,那触发器也会被自动执行了。
触发器简介:
触发器是一种特殊类型的过程。与普通过程不同的是,过程需要用户显式地调用才执行,而触发器则是当某些事件发生时,由Oracle自动执行。
触发器主要由如下几个部分组成:
触发事件:
触发条件:
触发对象:
触发 *** 作:
编写触发器时,需要注意以下几点:
触发器不接受参数。
一个表上最多可以有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。还需要注意,各个触发器之间不能有矛盾。
在一个表上的触发器越多,对在该表上的DML *** 作性能影响就越大。
触发器最大为32KB。如果确实需要,可以先建立过程,然后在触发器中用CALL语句调用。
在DML触发器中只能使用DML语句(select,insert,update,delete)。
在系统触发器中只能包含DDL语句(create,alter,drop)。
触发器中不能包含事务控制语句(mit,rollback,savepoint)。因为触发器是触发语句的一部门,触发语句被提交或回退时,触发器也就被提交或回退了。
在触发器主体中调用的任何过程、函数都不能使用事务控制语句。
在触发器主体中不能声明任何long和blob变量。新值new、旧值old也不能指向表中的任何long和blog列
不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用都有较大区别。
SQL中,触发器是什么?
1、触发器。 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的 *** 作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提) 我为什么要使用触发器?比如,这么两个表: Create Table Student( --学生表 StudentID int primary key, --学号 ) Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号 StudentID int , --学号 BorrowDate datetime, --借出时间 ReturnDAte Datetime, --归还时间 ) 用到的功能有: 1如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号); 2如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。 等等。 这时候可以用到触发器。对于1,创建一个Update触发器: Create Trigger truStudent On Student for Update ------------------------------------------------------- --Name:truStudent --func:更新BorrowRecord 的StudentID,与Student同步。 --Use :None --User:System --Author: 懒虫 # SapphireStudio ( chair3) --Date : 2003-4-16 --Memo : 临时写写的,给大家作个Sample。没有调试阿。 ------------------------------------------------------- As if Update(StudentID) begin Update BorrowRecord Set brStudentID=iStudentID From BorrowRecord br , Deleted d ,Inserted i Where brStudentID=dStudentID end 理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示>>
请问数据库 触发器有什么用
我就给你解释一下实际场景吧
比如你有两个表 A 和 B
A表有ID 和 NAME两列
B表有ID,PLAY,NAMEID三列,A与B没有关联
如果你想删除B表的内容,但是又同时想删除A表中AID=BNAMEID
那么你就要写两条语句
如果使用触发器
就只用写删除B表的内容语句,一旦删除内容,则触发器设定的表规则被触发,那么A表的相关内容也一起删除了
SQL中触发器有什么作用
当你对表进行了添删改查等 *** 作时,如果你需要做一些特定的业务 *** 作,就可以使用触发器。
顾名思义,触发,当你做了某种预设的 *** 作时才会执行触发器的命令
举个例子。。
假设你有个员工基础信息表,里面有员工的身份z号码,手机等基本信息。。
那么,当你换了身份z或手机,需要修改号码的时候,肯定是去修改员工的基础资料表。
假设你现在有别的地方,比如人事档案啊之类的,同样使用了员工的手机等信息。。难道你还要再去修改一次档案表么。。那么如果还有其他地方使用了呢?
而触发器就可以在这种时候做出判断,如果修改了基础表的信息,那么就同步把其他使用了基础表信息的地方也更改成最新的信息。。
大概就是这么个意思。。当然还有其他的作用
数据库中替代触发器的定义是什么 5分
(1)DML触发器:是指触发器在数据库中发生数据 *** 作语言(DML)事件时将启用。DML事件即指在表或视图中修改数据的insert、update、delete语句也。 (2)DDL触发器:是指当服务器或数据库中发生数据定义语言(DDL)事件时将启用。DDL事件即指在表或索引中
数据库中的触发器重点在什么地方
简单来讲哪就是事件触发。
比如你对数据库中的表进行了一个插删等 *** 作,你想在你即将做或者完成这个 *** 作的时候程序能自动做一点别的工作,比如你想对插入数据检查一下或者对删除后的数据总数进行一下统计。
本来哪,你可以把这个工作写在自己的程序里,就是把检查写在你插入动作之前或者把统计数目写在删除动作之后。这样的问题是:你要做插删的时候就都要写这些代码,而且很容易就遗漏了。
而触发器哪,你定义在某个 *** 作上,比如把那个检查的工作过程定义成插入的前触发器,把统计工作定义成后触发器,那么在你进行插入删除的时候,数据库那边的程序就自动的给你做了这个工作了。
主要作用哪:我感觉
一是完整性(防止自己编程的遗漏),
二是简单,
三是由数据库程序(比如Oracle)进行这项工作,而不是由你自己的程序做,效率高。
下面是人家的一些教程,其实道理是很简单的。你可以用它后面讲的几个数据库的例子,自己写一个,试试就知道了。
————————————————————————————————————————
一 触发器介绍
触发器是一种特殊的存储过程,它在插入,删除或修改特定表中
的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的
数据控制能力。数据库触发器有以下的作用:
安全性。可以基于数据库的值使用户具有 *** 作数据库的某种权
利。
# 可以基于时间限制用户的 *** 作,例如不允许下班后和节假日
修改数据库数据。
# 可以基于数据库中的数据限制用户的 *** 作,例如不允许股票
的价格的升幅一次超过10%。
审计。可以跟踪用户对数据库的 *** 作。
# 审计用户 *** 作数据库的语句。
# 把用户对数据库的更新写入审计表。
实现复杂的数据完整性规则。
# 实现非标准的数据完整性检查和约束。触发器可产生比规则
更为复杂的限制。与规则不同,触发器可以引用列或数据库对
象。例如,触发器可回退任何企图吃进超过自己保证金的期货。
# 提供可变的缺省值。
实现复杂的非标准的数据库相关完整性规则。触发器可以对数
据库中相关的表进行连环更新。例如,在auths表author_code列上的
删除触发器可导致相应删除在其它表中的与之匹配的行。
# 在修改或删除时级联修改或删除其它表中的与之匹配的行。
# 在修改或删除时把其它表中的与之匹配的行设成NULL值。
# 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。
# 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试
图进行数据更新的事务。当插入一个与其主健不匹配的外部键
时,这种触发器会起作用。例如,可以在booksauthor_code
列上生成一个插入触发器,如果新值与authsauthor_code列
中的某值不匹配时,插入被回退。
同步实时地复制表中的数据。
自动计算数据值,如果数据的值达到了一定的要求,则进行特
定的处理。例如,如果公司的帐号上的资金低于5万元则立即给财务人
员发送警告数据。
ORACLE与SYBASE数据库的触发器有一定的区别,下面将分别讲述
这两种数据库触发器的作用和写法。
二 ORACLE 触发器
ORACLE产生数据库触发器的语法为>>
数据库触发器中new表和old表是什么意思?
顾名思义,new是新插入的数据,old是原来的数据
insert只会有new,代表着要插入的新记录
delete只会有old,代表着要删除的记录
update由于执行的是先删除旧的记录,再插入新的记录,因此new和old都会有,且含义与上面的相同
SQL数据库中的触发器怎么写啊?急
CREATE TRIGGER trig_stu_update ON student
FOR UPDATE
AS
begin
end;
CREATE TRIGGER trig_stu_delete O功 student
FOR DELETE
AS
begin
end;
------------------
上面是更新、删除的触发器模板,将你的代码填在beginend之间。
触发器中经常用到的inserted,deleted。
inserted里面存放了insert、update *** 作的插入值或更新后值。
deleted里存放的是update、delete *** 作的更新前值或删除值。
使用方法:
declare @no int,@sex bit,@age int;
--insert、update取新值
select @no=no,@sex=sex,@age=age from inserted;
--delete、update删除值
select @no=no,@sex=sex,@age=age from deleted;
sql的触发器是干什么的,怎么用?
触发器的主要作用是,实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。
例如我们日常生活中常用的银行存储系统就应用了触发器机制:当我们在银行办理存款或是取款业务后,系统除了会记录我们的交易信息外,还会根据我们存入或取出的金额自动更新我们帐户的余额(存款 *** 作后增加帐户余额,取款 *** 作后减少帐户余额),当 *** 作中出现意外情况(如断电),系统还会回滚我们所做的 *** 作,以保证交易的完整性。
所以触发器是在对表进行插入、更新和删除 *** 作时自动执行的存储过程,同时它也具有事务的功能(整个 *** 作要么全部成功,要么全部失败)。
本文档旨在提供指南和核对清单,用于将之前升级的数据库从 Oracle 12c 降级回以前的版本:11203, 11202, 11107
必须加以说明的是,将数据库实例从当前版本降级到升级前的版本时,数据库不会返回到升级前的完全相同状态。根据所涉及的版本,升级过程会进行不可逆的更改。用户使用降级过程可以打开和访问以前版本的数据库实例。这通常便已足够。
可能需要采取其他更正 *** 作(例如卸载/重新安装或重新升级到当前补丁集级别来解决降级后的遗留问题。如果目标是让实例返回与升级前完全相同的状态,则还应使用包括完全恢复到升级前状态在内的其他过程。
本文中讨论的过程是基于脚本的降级。本文不介绍使用导出/导入、数据泵或其他方法将数据从一个版本移动到另一个版本。
您所降级到的版本的 Oracle 二进制文件,在开始降级过程之前应该在服务器上可用/已安装。如果您卸载了要降级到的 Oracle 可执行文件,请重新安装 Oracle 二进制文件到正确的版本/补丁程序级别以降级。
此过程旨在降级已成功升级到 12c 的数据库,并非用于从失败的升级退回。您只能降级到升级前所用的版本和补丁程序级别。
直接升级可以在版本 10205、11107 或版本 11202 及更高版本上执行。可以对这些版本中除 10205 之外的版本进行降级。
例如,如果通过应用中间补丁程序 11107 从 Oracle 11106 升级到 Oracle 12c (1210),则不能降级到 Oracle 11106。降级只能对直接升级版本执行。
例外:
虽然可以对 10205 直接升级,但降级不适用于 10205。
这是因为在升级过程中,compatible 参数已设置为最低 1100。这使得无法降级到 10205。可以降级的版本为 11107、11202、11203 或更高版本。
如果有任何补丁程序应用到了从升级后的主目录运行的源数据库,则需要先回退,然后才能开始降级过程。
卸载和回退补丁程序的步骤记录在所涉及补丁程序的自述文件中。
未能卸载和回退补丁程序可能会导致无法降级,包括无法重新验证字典对象。
Exadata 捆绑补丁程序示例,其过程为:
卸载补丁程序
示例: $ opatch auto /u01/app/oracle/patches/14103267 -rollback
回退任何在补丁程序应用过程中应用的 SQL:
示例: SQL> @rdbms/admin/catbundle_EXA_<数据库 SID>_ROLLBACKsql,用于回退 SQL 更改。
解决方案
降级前步骤
- XML DB 组件在 12c 中是必需的。
在升级到 12c 期间,将安装 XML DB 组件(如果未安装)。
从 12c 降级将删除安装的 XDB 组件
- Enterprise Manager 不支持降级。在降级之前,请重新配置 Oracle EM 控件。请参阅
Oracle Database Upgrade Guide 12c Release 1 (121) E17642-10
6 Downgrading Oracle Database to an Earlier Release
665 Restoring Oracle Enterprise Manager after Downgrading Oracle Database
- 升级到 12c 期间,将删除 Database Control 资料档案库。降级之后,请重新配置 DB Control。
Note 8708771 How To Save Oracle Enterprise Manager Database Control Data Before Upgrading The Single Instance Database To Other Release
Note 8763531 How To Restore The Oracle Enterprise Manager Data To Downgrade The Single Instance Database To Previous/Source Release
- compatible 参数不能已经更改到 1210。
- 禁用 Data Vault(如果已启用)。
Note 8039481 How To Uninstall Or Reinstall Database Vault in 11g (UNIX)
Note 4539021 Enabling and Disabling Oracle Database Vault in WINDOWS
- 如果数据库使用 Oracle Label Security,则在新 Oracle Database 12c Oracle 主目录中运行 Oracle Label Security (OLS) 预处理降级 olspredowngradesql 脚本(在 $ORACLE_HOME/rdbms/admin 上提供)。
- 时区版本应相同。
- 取消设置并指向 12c 主目录的 ORA_TZFILE(如果已设置)。
- 如果数据库上有 Oracle Application Express,则必须将 apxrelodsql 文件从 Oracle Database 12c $ORACLE_HOME/apex/ 目录复制到 Oracle 主目录之外的目录,例如系统上的临时目录以稍后执行。
- 如果基于固定对象创建了对象,则删除这些对象以避免可能的 ORA-00600 错误。您可以在降级之后重新创建这些对象。
- 如果降级集群数据库,则彻底关闭实例并将 CLUSTER_DATABASE 初始化参数更改为 FALSE。降级之后,必须将此参数设置回 TRUE。
满足以上先决条件之后,可以继续进行降级。
数据库的降级步骤
1) 确保所有数据库组件有效。只能从成功升级的数据库执行降级。要验证数据库组件状态,请执行以下查询
以 SYS 用户身份连接到数据库
col comp_id format a10
col comp_name format a30
col version format a10
col status format a8
select substr(comp_id,1,15) comp_id,substr(comp_name,1,30) comp_name,substr(version,1,10) version,status from dba_registry
2) 验证没有属于 sys/system 的无效对象
select owner, count(object_name) "Invalid object count" from dba_objects where status!='VALID' and owner in ('SYS','SYSTEM') group by owner;
如果计数为零,则可以继续降级。
如果有无效对象,则执行 utlrpsql 多次,如果对象无法解析为有效状态,则不能继续降级。建立 SR 或在 DBA 社区上发帖以寻求帮助。
或者,对于 1 和 2,运行以下脚本:
Note 5566101 Script to Collect DB Upgrade/Migrate Diagnostic Information (dbupgdiagsql)
3) 关闭数据库
Shutdown immediate
4) 对 12c 数据库做备份
5) 以降级模式启动数据库
Startup downgrade;
6) 执行降级脚本
Sql> Spool downgradelog
Sql> @$ORACLE_HOME/rdbms/admin/catdwgrdsql
注:
$ORACLE_HOME 应指向 12c 主目录
catdwgrdsql 脚本将数据库中的所有组件降级到支持的主版本或补丁集版本(您最初升级时的版本)
Sql> spool off
Sql> shutdown immediate
Exit SQL Plus
Sql> exit;
7) 如果 *** 作系统为 LINUX/UNIX:
将以下环境变量更改为要降级到的源数据库:
ORACLE_HOME
PATH
编辑 /etc/oratab or /var/opt/oracle/oratab 以更改
将数据库映射到源数据库 Oracle 主目录
如果 *** 作系统是 Windows,则完成以下步骤:
a 停止所有 Oracle 服务,包括 Oracle Database 12c 数据库的 OracleServiceSID Oracle 服务,其中 SID 是实例名称。
例如,如果 SID 为 ORCL,则在命令行提示符中输入以下内容:
C:\> NET STOP OracleServiceORCL
b 在命令提示符下,通过运行 ORADIM 命令删除 Oracle 服务。如果出现提示,则输入此 Windows 系统上活动标准用户帐户的口令。
例如,如果 SID 为 ORCL,则输入以下命令:
C:\> ORADIM -DELETE -SID ORCL
c 在命令提示符下,使用 ORADIM 命令创建要降级的数据库的 Oracle 服务。
C:\> ORADIM -NEW -SID SID -INTPWD PASSWORD -MAXUSERS USERS
-STARTMODE AUTO -PFILE ORACLE_HOME\DATABASE\INITSIDORA
8) 还原配置文件
将配置文件(口令文件、参数文件等)还原到降级版本的 ORACLE_HOME。
9) 如果这是 Oracle RAC 数据库,则执行以下命令以将数据库修改为单实例模式:
SET CLUSTER_DATABASE=FALSE
10) 从降级版本 $ORACLE_HOME/rdbms/admin 目录执行 catrelod 脚本。
启动 sqlplus,以具有 sysdba 权限的用户 SYS 身份连接到数据库实例,然后以升级模式启动数据库:
: cd $ORACLE_HOME/rdbms/admin
: sqlplus
sql> connect sys as sysdba
sql> startup upgrade
sql> spool catrelodlog
sql> @/rdbms/admin/catrelodsql
sql> spool off
catrelodsql 脚本在降级的数据库中重新加载各个数据库组件的合适版本。
11) 运行 utlrpsql 脚本:
SQL> @utlrpsql
Sql> exit;
utlrpsql 脚本重新编译先前处于 INVALID 状态的所有现有 PL/SQL 模块,例如 package、procedure、type 等。
12) 检查已降级数据库的状态:
Note 5566101 Script to Collect DB Upgrade/Migrate Diagnostic Information (dbupgdiagsql)
此 sql 脚本是一组查询语句,用于提供用户友好的输出,以在升级前后诊断数据库的状态。脚本将创建名为 db_upg_diag_<sid>_<时间戳>log 的文件。
13) 降级之后,可能在 sys 用户下发现无效的 QT 视图。这是因为视图已从基表中选择了错误的列。您需要重新创建这些视图。
请参阅说明:
Note 15202091 QT_BUFER Views Invalid after downgrade from 12C
降级后步骤:
1)如果您是降级到 Oracle Database 11g 版本 1 (11107) 并且数据库中有 Oracle Application Express,则转到您将 apxrelodsql 脚本复制到的目录(在降级前步骤中)。
运行 apxrelodsql 脚本以手动重新加载 Oracle Application Express:
SQL> @apxrelodsql
运行 apxrelodsql 脚本以避免程序包 APEX_030200WWV_FLOW_HELP 由于以下错误而成为 INVALID 状态:
PLS-00201: identifier 'CTX_DDL' must be declared
2) 如果数据库中启用了 Oracle Label Security,则执行以下脚本
a 从 Oracle Database 12c 的 Oracle 主目录下将 olstrigsql 脚本复制到要将数据库降级到的版本的 Oracle 主目录。
b 从降级到的版本的 Oracle 主目录,运行 olstrigsql 以在表上使用 Oracle Label Security 策略重新创建 DML 触发器:
SQL> @olstrigsql
3) 如果降级集群数据库,则必须运行以下命令以降级 Oracle Clusterware database 配置:
$ srvctl downgrade database -d db-unique-name -o oraclehome -t to_version
其中 db-unique-name 是数据库名称(而非实例名称),oraclehome 是已降级数据库的旧 Oracle 主目录的位置,to_version 是数据库所降级到的数据库版本
在一个transaction发生的过程中,online redo log首先记录transaction中修改的数据块相关信息,修改的数据块会被缓存在database buffer cache中。由于database buffer cache写满或者checkpoint等等条件触发dbwn进程,会导致这些缓存的数据块写入数据文件,但此时可能该transaction仍然还没有提交。所以在数据文件中,可能会有commited 和 uncommited 的数据块。而原有的数据块镜像会存放在undo segment。IXDBANET社区论坛然而,dbwn写脏数据时不管这个要写的transaction是否提交,也没有必要去管。这样就发生了所谓的已经提交的数据,但是还没有写入数据文件的现象。还有一种情况,数据没有提交,但是已经被写入数据文件,此时发生回退,撤销没有提交的数据。根本原因是commit后写redo buffer和触发lgwr写 redo buffer的区别。事务在执行完毕后,随即会被写入redo buffer和undo中,同时在redo buffer和undo中对该事务都有一个是否提交的标记。两者的默认状态都是active的,即没有提交时刻处于激活状态。commit *** 作执行时刻把此前的所有事务 *** 作全部写入redo log file,commit成功后,redo buffer信息全部写入redo file,同时修改两者中的事务提交标识为inactive,表示此前事务已经递交。oracle的前滚和回退根据就是依据事务是否提交而进行的。在触发lgwr进程后,oracle同样把此前的redo buffer信息写入redo file,但是与commit触发写日志不同的是,redo file本身对lgwr写日志 *** 作不记录任何信息标识,lgwr写到那里就是那里,就算此时掉电也无妨,redo file就记录到掉电时刻的信息。lgwr是一个Oracle后台执行的进程,具体的日志写 *** 作都有oracle去控制,这对于oracle来说是透明的,因此不用在redo file中写入任何标记信息,这也是正常的。于是,Oracle崩溃恢复步骤如下:首先rolling forward 前滚:由于oracle failure,sga中的内存信息丢失了,但是online redo log中还是存储了transaction信息,包括commited or uncommited data。可能这些修改信息并没有被oracle正确的来处理,包含两种情况:已经提交的还没有写入数据文件,或者没有提交的却被写入了数据文件。针对已经提交的还没有写入数据文件就要发生前滚,在前滚过程中,smon会根据online redo log中的记录来完成对datafile的修改。保证已经提交的数据已经写入数据文件。接下来,前滚结束后,数据库正常open,此时用户可以正常连接,可以访问已经recover的commited data,但是对于那些属于unrecoverable transaction的uncommited data,会被oracle 加锁,是不可以访问的。
回滚是为了保证事务一致性,如果在一个大事务中,中途出现错误,就需要回滚,否则会出现前面的做的成功了,后面的失败了的情况
比如说取钱,如果没有回滚,那么你选择了取10000块钱的时候,选择成功了,但是实际里面没那么多钱了,此时不回滚事务的话,就会出现扣除你的存款10000元,但是你却没取到那么多钱的情况了
以上就是关于关于数据库的回滚全部的内容,包括:关于数据库的回滚、数据库中触发器是什么、如何将 12c 数据库降级为以前的版本等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)