2 yuqiong968 yuqiong968 于 2013.08.22 15:24 提问

关联到两张表,如何写触发器

要求:
数据在insert 到表A前(一笔一笔Insert),如果表A的字段1的值存在于表B中的字段2中,则报错,数据无法insert到表A中。
这个触发器要怎么写呢。高人指点下。。

3个回答

yuqiong968
yuqiong968   2013.08.23 16:18
已采纳

已经找到方法了。如下,
其中定义的变量为m,一开始定义成connt还不行。。。

create or replace trigger INSERT_AA
before insert on aa

For Each Row
declare
-- local variables here
m Number;
Begin
Select Count(*) Into m From bb Where BB.ID=:new.Id ;
If m>0 Then
raise_application_error(-20001,'error');
End If;
end INSERT_AA;

zhuhl2011
zhuhl2011   2013.08.22 17:53

CREATE OR REPLACE TRIGGER TRI_T_A_FORINSERT
BEFORE INSERT ON A FOR EACH ROW
BEGIN
INSERT INTO A
VALUES
(:NEW.A1, :NEW.A2);
if (select 1 from B where b.b1 = :NEW.A1) = 1 then

RAISE_APPLICATION_ERROR('不能修改表');

end if;

END;
不知道这样子行不行 你看看 希望对你有帮助

yuqiong968
yuqiong968 虽然没有验证是否可行,但是你的答案给了我思路。谢谢~
接近 5 年之前 回复
yuqiong968
yuqiong968   2013.08.23 15:46

不行呢,有提示
Compilation errors for TRIGGER BRISA.INSERT_AA

Error: PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:

      ( - + case mod new not null others <an identifier>
      <a double-quoted delimited-identifier> <a bind variable> avg
      count current exists max min prior sql stddev sum variance
      execute forall merge time timestamp interval date
      <a string literal with character set specification>
      <a number> <a single-quoted SQL string> pipe
      <一个带有字符集说明的可带引号的字符串文字>
      <一个可带引号的 SQ

Line: 7
Text: If (Select ID From BB Where BB.ID=:new.Id ) Then

Error: PLS-00103: Encountered the symbol ")" when expecting one of the following:

      . ( * @ % & - + ; / at for mod remainder rem
      <an exponent (**)> and or group having intersect minus order
      start union where connect || indicator multiset

Line: 7
Text: If (Select ID From BB Where BB.ID=:new.Id ) Then

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
SQL server触发器实例讲解(如何实现两个表的关联)
SQL server触发器实例讲解(如何实现两个表的关联) SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器?比如,这么两个表: Create Ta
sql server 两个表之间的关联(触发器)
create trigger tri_user_book on user_book after update as begin update book_borrow set book_borrow=user_book.borrow_is from book_borrow inner join inserted user_book on book_borrow.book_borrow=
两个关联表间如何建立触发器
实现功能描述:表C由表A、表B关联生成(其中表A、表B在物理库中,表C在内存数据库中),表A、表B数据变化后通过触发器将变化后记录插入到小表C_inc中,通过小表触发,最后用内存库的实时同步功能将C_inc小表中的记录同步到内存库表C中。 …… 修改后的实现方案: 在基表表A、表B上建立触发器,触发器上使用游标操作,进行2个表的关联操作。
MySQL用触发器同步两张表
MySQL用触发器同步两张表 在MySQL环境下面,建立相关触发器,在两个表之间相关sql,希望能帮到大家 1.建表 CREATE TABLE `person` (   `id` int(11) DEFAULT NULL,   `name` varchar(256) DEFAULT NULL,   `sex` char(16) DEFAULT NULL )  CREATE TABLE `person_ex`
MySQL 触发器例子(两张表同步增加和删除)
例子1: 创建两个表,目的是在一个表里添加一条记录,另一个表也添加一条记录: DROP TABLE IF EXISTS tab1; CREATE TABLE tab1( tab1_id varchar(11) ); DROP TABLE IF EXISTS tab2; CREATE TABLE tab2( tab2_id varchar(11) ); 创建触发器:t_a
mysql——两张表(双向触发器)增、删、更新完美测试通过,互不影响
先建数据库: create database mytest; use mytest; DROP TABLE IF EXISTS `user1`; CREATE TABLE `user1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, `phone` varchar(30) NOT NULL,
sql server触发器实现插入时操作另一张表
以前都是也得mysql,现在写sqlserver的触发器,感觉改动还是蛮大的 1.定义变量 #在mysql中变量直接这么定义就可以了 SET @VALUE = "111"; #在sql server中 declare @count int; #并赋值 set @count =0; #如果是查询,必须这么些 select @count = count(*) from WQ_MNINF_D_RE
MySQL 触发器例子(两张表同步增加和删除)
原文链接:http://www.cnblogs.com/findumars/archive/2013/05/22/3092036.html 以下两个例子来自: http://www.cnblogs.com/nicholas_f/archive/2009/09/22/1572050.html 实测有效,但是原帖的分隔符不正确,因此稍作修改。 其中old表示tab2(被动触发),new
使用sqlserver触发器同步两张表数据
在开发的时候,会遇到当操作一张表的数据时,也想在另一张表中操作数据。这时我们就可以使用触发器来实现。 例如在用户表sys_user中插入和删除数据的时候,也ACT_ID_USER表做插入和删除的操作。 触发器代码:http://yayihouse.com/yayishuwu/chapter/1042
Oracle 触发器两表同步
<br />触发器无需commit<br />也不能写commit<br />触发器和触发它的DML是同一个事务<br />DML提交了,触发器的操作也提交了,要不就一起回滚了<br /><br />当然,如果你一定要在触发器里写COMMIT<br />那就用自治事务<br />相当于一个事务里的子事务<br />正常情况下,Oracle规定在触发器中不能运行 ddl语句和commit,rollback语句。<br />解决办法有两种:<br />1.在可以在触发器中加入:pragma autonomous