2012-05-03 41 views
0

我目前有一个问题实现一个简单的任务,其中一个现有的客户的新工作,直到他们还清债务时才被批准。我认为这会很简单,直到我发现SQL-92断言在Oracle中不工作... ...SQL/Oracle 10g - 问题与断言

我环顾网络,看到有可能做同样的事情,但与触发器/检查约束。然而,我完全失去了如何实现这一目标。

我的数据库的结构,像这样:

Table invoice is in a one-to-many relationship with jobs 
Table jobs is in a many-to-one relationship with client 

目前我有:

CREATE TRIGGER check_debt 
BEFORE UPDATE ON jobs 
FOR EACH ROW 
WHEN ((SELECT * FROM client WHERE clientNo = 
(SELECT * FROM jobs WHERE jobNo = 
(SELECT * FROM invoice WHERE status = 'Debt Owing')))) 
COMMIT; 

正如你所看到的,我不知道如何来模拟一个触发断言.. 。

任何帮助表示赞赏!

谢谢。

注意:我在练习使用SQL-92和SQL-99标准。

+0

你能用文字解释你试图在这个触发器中断言什么吗?我很难理解这个触发器的目标是什么。这可能也有助于在这里定义四个表格('client','jobNo','invoice'和'jobs') –

+0

对不起,实际上有3个表格(jobNo应该是工作......我的坏话)。基本上,我想断言,除非他们以前的工作发票已经支付(因此发票中的状态是“债务欠款”),否则不能从现有客户接受工作(客户有多个工作提议)。希望清除它更高技能 – tester

回答

1

当您对作业进行更新时,包括查询以检查发票的状态。

update jobs 
    set ... 
where ... -- logic to select job to update 
and not exists (
     select * 
     from invoice 
     where ... -- insert join condition 
     and status = 'Debt Owing') 

然后检查一行是否已更新(方法取决于您使用的客户端)。

+0

我可以看看这将如何工作,但我使用sqldeveloper,只是使用接口来插入/更新/删除行 – tester

+0

sqldeveloper允许您运行更新语句 - 只需粘贴到sql编辑器并点击绿色的“运行”按钮。 –