在MS SQL服务器中编写触发器与在MS Access中编写触发器相同吗?

时间:2009-06-17 08:32:08

标签: sql sql-server ms-access triggers

我在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中运行还是语法不同?

5 个答案:

答案 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)

答案 3 :(得分:0)

MS Access没有触发器。

即Access Jet引擎(创建.mdb文件)。如果Access连接到数据库服务器,那么它将使用该数据库中的任何触发器。

答案 4 :(得分:0)

除非在SQL Server上处理ADP,否则我从未遇到过Access中的触发器。所以你的答案是肯定的,如果你在后端使用SQL Server,那就是一样的,如果表存储在Access中则不是。