Plsql 如何在Oracle PL/SQL中编写delete触发器-无法识别;“匹配行”;

Plsql 如何在Oracle PL/SQL中编写delete触发器-无法识别;“匹配行”;,plsql,triggers,Plsql,Triggers,我正在编写一个触发器,一旦我删除一行,我想删除另一个表中的对应行(这是common\u cis.security\u function) 源表为party.security\u函数 以下是通用信息安全功能中的列: URL SCRTY_FUNC_NAME SCRTY_FUNC_DESC IDN CREATE_TMSTMP CNCRCY_USER_IDN UPDATE_USER_SRC_SYS_CD UPDATE_USER_ID UPDATE_TS SCRT_FUNC_NM SCRT_FUNC_D

我正在编写一个触发器,一旦我删除一行,我想删除另一个表中的对应行(这是
common\u cis.security\u function

源表为
party.security\u函数

以下是
通用信息安全功能中的列:

URL
SCRTY_FUNC_NAME
SCRTY_FUNC_DESC
IDN
CREATE_TMSTMP
CNCRCY_USER_IDN
UPDATE_USER_SRC_SYS_CD
UPDATE_USER_ID
UPDATE_TS
SCRT_FUNC_NM
SCRT_FUNC_DESC
CREAT_USER_SRC_SYS_CD
CREAT_USER_ID
CREAT_TS
以下是参与方安全功能中的列:

URL
SCRTY_FUNC_NAME
SCRTY_FUNC_DESC
IDN
CREATE_TMSTMP
CNCRCY_USER_IDN
UPDATE_USER_SRC_SYS_CD
UPDATE_USER_ID
UPDATE_TS
SCRT_FUNC_NM
SCRT_FUNC_DESC
CREAT_USER_SRC_SYS_CD
CREAT_USER_ID
CREAT_TS
到目前为止,我得到的是:

delete from common_cis.security_function   CCSF

                                             where CCSF.SCRTY_FUNC_NAME = :new.SCRT_FUNC_NM;
这是正确的想法吗?还是使用某种行ID


谢谢

我认为您应该使用完整性约束,即带有“ON DELETE CASCADE”条件的外键约束。 下面是一个示例,但首先检查您的模式中是否有我使用过的名称的表:

-- create tables:
create table master_table(
URL             varchar2(1000),
SCRTY_FUNC_NAME varchar2(100),
SCRTY_FUNC_DESC varchar2(1000));

create table detail_table(
SCRT_FUNC_NM   varchar2(100),
SCRT_FUNC_DESC varchar2(1000),
UPDATE_USER_ID number,
UPDATE_TS      varchar2(100));

-- add primary key and foreign key constraints:
alter table master_table add constraint function_pk primary key (SCRTY_FUNC_NAME);

alter table detail_table add constraint function_fk foreign key (SCRT_FUNC_NM) references master_table (SCRTY_FUNC_NAME) on delete cascade;

-- fill tables with data:
insert into master_table
values ('url number 1', 'sec function #1', 'description of function #1');

insert into detail_table
values('sec function #1', 'description', 1, '123abc');

insert into detail_table
values('sec function #1', 'description', 2, '456xyz');

-- check tables: first contains 1 row and second - 2 rows
select count(*) from master_table;

select count(*) from detail_table;

-- delete rows from first table only:
delete from master_table;

-- check tables once again - both are empty:
select count(*) from master_table;

select count(*) from detail_table;

-- clear test tables:
drop table detail_table;

drop table master_table;