触发器中SQL语句不能:读取或更新触发语句的任何变异表也包括触发表本身,读取或更新该触发表的约束表的主键列、唯一性键列或外键列但是如果需要也可以更新其他列。这些限制约束适用于所有行级触发器。但有个特例就是如果INSERT只影响一行记录那么定义在这行上的行级BEFORE和AFTER触发器就不会将这个触发表当作变异表。
那么要想实现就意味这不能在行级触发器里查询该表,但是可以在语句级触发器里查询它。但是不能简单的将它设计成一个语句级触发器因为我们需要在触发器主体中使用:new.major的值。这个问题的解决办法就是创建2个触发器一个行级的一个语句的,在行级里记录:new.major的值但是不查询表,查询在语句里实现。那么怎么记录值呢,就要通过一个包了。
确保变量成为全局变量的唯一方法就是将它存放在某个包中:
create or replace package studentdata as
type t_majors is table of students.major%type index by binary_integer;
type t_ids is table of students.id%type index by binary
v_studentmajors t_majors;
v_studentids t_ids;
v_numbertries binary_integer:=0;
end studentsdata;
create or replace trigger rlimitmajors
before insert or update of major on students
for each row
begin
studentdata.v_numbertries:=studentdata.v_numbertries+1;
studentdata.v_studentmajors(studentdata.v_numberies):=:new.major;
studentdata.v_studentids(studentdata.v_numberies):=:new.id;
end rlimitmajors;
create or replace trigger slimitmajors
after insert or update of major on students
declare
v_maxstudents constant number:=2;
v_currentstudents number;
v_studentid student.id%type;
v_major students.major%type;
begin
for v_loopindex in 1..studentdata.v_numberies loop
v_studentid:=studentdata.v_studentids(v_loopindex);
v_major:=studentdata.v_studentmajors(v_loopindex);
select count(*) into v_currentstudents from students where major=v_major;
if v_currentstudents>v_maxstudents then
raise_application_error(-20000,'too many students for major '||v_major||'because of student'||v_studentid);
end if;
studentdata.v_numberies:=0;
end slimitmajors;
分享到:
相关推荐
例如,在下面的SQL语句中,我们创建了一个名为`rateStatus`的触发器,它在`currentrate`表上进行UPDATE操作时执行: ```sql CREATE TRIGGER rateStatus NO CASCADE BEFORE UPDATE OF rate ON currentrate ...
本文将详细介绍如何在SQL Server中创建触发器来实现当本地数据库发生数据插入时,在远程服务器上相应地执行SQL语句,实现数据同步。这通常用于需要跨数据库同步数据的应用场景。 #### 准备工作 在开始之前,确保...
在SQL Server 2000这样的关系型数据库管理系统中,可以通过定义触发器来轻松地实现这一需求。 #### 二、触发器简介 **触发器**是一种特殊的存储过程,它会在特定的事件(如INSERT、UPDATE或DELETE)发生时自动执行...
触发器是数据库中一种特殊类型的存储过程,它被定义为在特定事件(如INSERT、UPDATE或DELETE操作)发生时自动执行的一组SQL语句。本文将详细介绍如何创建一个触发器来确保当对一张表进行更新时,另一张相关的表也会...
用友U8展BOM sql 语句,正展,适用于算成本等等
SQL语句,存储过程,触发器
本篇文章将详细介绍如何在SQL Server中创建一个触发器,当某个表中的特定字段被更新时,记录相关信息到另一个表中,以实现类似日志记录的功能。 #### 触发器概述 触发器是SQL Server提供的一种机制,可以在表或视图...
触发器可以帮助实现复杂的业务规则和数据完整性,通过扩展SQL语句的功能,提供了一种在数据库层面上对数据进行操作的机制。 一、触发器的类型 SQL Server 2005中的触发器分为两种类型: 1. DML触发器:包括AFTER和...
在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看当前会话所执行的SQL语句及相关信息。 ###...
这些T-SQL语句是数据库开发人员和管理员日常工作中不可或缺的工具。 首先,让我们详细了解每个概念: 1. **触发器**:触发器是一种特殊的存储过程,当对数据库中的特定表执行DML操作(INSERT、UPDATE或DELETE)时...
通过以上简单的介绍,希望原来没有使用过触发器的朋友能对触发器有个大致的概念和印象,如果你要深入了解的话,SQL SERVER 联机丛书就是你的好帮手。 触发器的应用非常广泛,它可以用来强制复杂的业务规则或要求,...
在SQL中,触发器是一种非常重要的数据库对象,它允许开发者定义特定的数据操作行为,这些行为会在数据更改(如INSERT、UPDATE或DELETE)时自动执行。触发器主要用于维护数据的完整性和一致性,它弥补了主键和外键...
触发器是SQL Server中一种特殊的存储过程,其特点在于不能被显式地调用,而是当对特定表进行数据操作(如插入、更新或删除)时自动激活。通过这种方式,触发器能够帮助实现复杂的业务逻辑和数据完整性约束。 #### ...
SQL Server 2000 触发器是数据库管理系统中的一种重要特性,它允许数据库管理员在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时执行预定义的T-SQL语句序列。触发器可以被看作是数据库的自动响应机制,类似于...
本资源集合了泛微系统中与SQL Server数据库交互时常用的各种SQL语句,涵盖了组织架构、流程管理以及自定义需求等多个方面。以下是对这些SQL语句知识点的详细解释: 1. **组织架构相关SQL**: - 组织架构是企业信息...
适合基础人群参考的一些知识点,也有些注释,可以直接使用
触发器是数据库管理系统中的一个重要概念,特别是在SQL Server中,它们被用来自动执行一系列操作或一系列SQL语句,这些操作通常与数据库表中的数据变化相关联,如INSERT、UPDATE或DELETE操作。 SQL Server中的...
触发器可以由在特殊表上执行的语句触发,或 UPDATE 表中特定的字段时触发。 CREATE TRIGGER 语句用于向数据库 schema 中添加触发器。语法如下: CREATE TRIGGER trigger-name [ BEFORE | AFTER ] database-event ...
3、创建一个instead of行级触发器,为贷款表(LoanT)定义完整性规则“贷款日期(Ldata)不能早于当前日期,如果早于,自动改为当前日期”。 4、创建一个DELETE触发器,当贷款表(LoanT)中的记录被删除时,将删除的...
首先,标题中的"sqlserver自动生成sql语句工具"指的是可以分析SQL Server数据库结构和数据,自动生成对应的SQL创建语句的软件。这种工具通常能帮助数据库管理员快速获取数据库的定义,便于备份、迁移或在其他环境中...