我在SQL server中编写了以下触发器:
create trigger test_trigger
on invoice -- This is the invoice table
for insert
as
declare @invoiceAmount int -- This is the amount specified in the invoice
declare @custNumber int -- This is the customer's id
--use the 'inserted' keyword to access the values inserted into the invoice table
select @invoiceAmount = Inv_Amt from inserted
select @custNumber = cust_num from inserted
update customer
set amount = @invoiceAmount
where Id = @custNumber
这可以在MS Access中运行还是语法不同?
答案 0 :(得分:3)
Access数据库引擎(以前称为Jet)没有触发器,并且无论如何都没有控制流语法,例如程序必须只包含一个SQL语句。
告诉我们你真正想做什么,可能有另一种语法。
例如,您可以使用发票上的UNIQUE约束(cust_num,Inv_Amt),引用新密钥的FOREIGN KEY客户(id,金额)创建新密钥,在FOREIGN上连接两个表的VIEW KEY列并公开所有四列,然后INSERT进入VIEW而不是表'invoice';您可能希望使用特权来阻止INSERT到基表,但是从新的Access 2007引擎(称为ACE)中删除了用户级安全性。
但是,如果你不介意我说,我认为你的触发器并不反映现实生活中的情况。表'客户'中的一个名为'amount'的列,用于保存最新的发票金额?插入的逻辑表何时包含多个客户的行?正如我所说,我认为你需要告诉我们你真正想要实现的目标。
答案 1 :(得分:2)
Access没有触发器
你在这里显示的触发器将会爆炸,因为当有人更新多行时,它不会考虑多行更新(并且不会说它不会发生,因为它会更好地练习一些防御性编码)
不是每行触发每批次触发,请阅读Multirow Considerations for DML Triggers
加入插入的伪表和发票表,以更新值...适用于1行和1行以上
答案 2 :(得分:1)
他们可能会进入Access 2010? http://blogs.msdn.com/access/archive/2009/08/13/access-2010-data-macros-similar-to-triggers.aspx
答案 3 :(得分:0)
MS Access没有触发器。
即Access Jet引擎(创建.mdb文件)。如果Access连接到数据库服务器,那么它将使用该数据库中的任何触发器。
答案 4 :(得分:0)
除非在SQL Server上处理ADP,否则我从未遇到过Access中的触发器。所以你的答案是肯定的,如果你在后端使用SQL Server,那就是一样的,如果表存储在Access中则不是。