触发器问题

wfdoohla 2004-05-12 01:37:31
#表
CREATE TABLE films2 (
code CHARACTER(5),
title CHARACTER VARYING(40),
did DECIMAL(3),
date_prod DATE,
kind CHAR(10)
)

#创建触发器
CREATE SEQUENCE SDID
INCREMENT BY 1
START WITH 1
MAXVALUE 99999999
/
CREATE TRIGGER FILMS2_BEFORE_INSERT_ROW
BEFORE INSERT ON films2
FOR EACH ROW
Begin
SELECT SDID.NEXTVAL FROM DUAL;
End;
/

执行
insert into films2 ( CODE, TITLE, DID ) values ( 'ss14','tss1s4',190 )

错误为
trigger 'SYSTEM.FILMS2_BEFORE_INSERT_ROW' is invalid and failed re-validation
...全文
63 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfdoohla 2004-05-12
  • 打赏
  • 举报
回复
有兴趣到这些地方领分
这样创建触发器 那错了? 在线等(wfdoohla)
如何建立自增主键(wfdoohla)
wfdoohla 2004-05-12
  • 打赏
  • 举报
回复
谢谢大家
wfdoohla 2004-05-12
  • 打赏
  • 举报
回复
错误

ERROR at line 1:
ORA-04089: cannot create triggers on objects owned by SYS

SQL> connect system /as sysdba
Enter password:
Connected.
SQL> CREATE TRIGGER aaaa_BEFORE_INSERT_ROW
BEFORE INSERT ON aaaa
FOR EACH ROW
Begin
SELECT FFFF1.NEXTVAL FROM DUAL;
End;
/
2 3 4 5 6 7 CREATE TRIGGER aaaa_BEFORE_INSERT_ROW
*
ERROR at line 1:
ORA-04089: cannot create triggers on objects owned by SYS
ttoc 2004-05-12
  • 打赏
  • 举报
回复
pl/sql 中的select语句好像必须有into,begin和end之间必须有语句

SQL> CREATE TABLE films2 (
2 code CHARACTER(5),
3 title CHARACTER VARYING(40),
4 did DECIMAL(3),
5 date_prod DATE,
6 kind CHAR(10)
7 );

表已创建。

SQL>
SQL> CREATE SEQUENCE SDID
2 INCREMENT BY 1
3 START WITH 1
4 MAXVALUE 99999999
5 /

序列已创建。

SQL>
SQL> CREATE TRIGGER FILMS2_BEFORE_INSERT_ROW
2 BEFORE INSERT ON films2
3 FOR EACH ROW
4 Begin
5 null;
6 End;
7 /

触发器已创建
wfdoohla 2004-05-12
  • 打赏
  • 举报
回复
CREATE TRIGGER FILMS2_BEFORE_INSERT_ROW
BEFORE INSERT ON films2
FOR EACH ROW
Begin
NULL;
End;

还是提示
trigger 'SYSTEM.FILMS2_BEFORE_INSERT_ROW' is invalid and failed re-validation

目的是在 films2 中增加自增主键 DID
anbeel 2004-05-12
  • 打赏
  • 举报
回复
这样呢?
Begin
NULL;
End;
dlmaomao 2004-05-12
  • 打赏
  • 举报
回复
问题:
1、你建的触发器做什么用?
2、语句insert into films2 ( CODE, TITLE, DID ) values ( 'ss14','tss1s4',190 )
在那执行?sql> 还是程序中?
3、1和2之间有何联系?
LGQDUCKY 2004-05-12
  • 打赏
  • 举报
回复
改为这样
create or replace FILMS2_BEFORE_INSERT_ROW
before insert on films2 for each row
declare
next_id number;
begin
select SDID.NEXTVAL into next_id from dual;
:new.id := next_id;
end;
wfdoohla 2004-05-12
  • 打赏
  • 举报
回复
我修改为
CREATE TRIGGER FILMS2_BEFORE_INSERT_ROW
BEFORE INSERT ON films2
FOR EACH ROW
Begin
SELECT SDID.NEXTVAL INTO :NEW.DID FROM DUAL;
End;

DID 是 films2 的字段吧?
还是一样的错误.

我在
Begin
End;
中不写语句也会出错
sunliwen780502 2004-05-12
  • 打赏
  • 举报
回复
SELECT一句应该为SELECT SDID.NEXTVAL INTO :NEW.id FROM DUAL;
其中的id 为字段
welyngj 2004-05-12
  • 打赏
  • 举报
回复
SELECT SDID.NEXTVAL FROM DUAL; --错误
welyngj 2004-05-12
  • 打赏
  • 举报
回复
CREATE TRIGGER FILMS2_BEFORE_INSERT_ROW
BEFORE INSERT ON films2
FOR EACH ROW
Begin
SELECT SDID.NEXTVAL FROM DUAL;
End;
/
要实现什么?

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧