【问题标题】:Creating a trigger to store an audit trail创建触发器以存储审计跟踪
【发布时间】:2021-06-22 00:05:41
【问题描述】:

我必须在 Claims 表上创建一个触发器,只要将新记录插入到 Claims 表中就会触发该触发器。此触发器应存储客户名称和该客户的 amount_of_claim 总数。

Claim_audits(审计表)已经创建。

架构:

Claims

id int(11)
status_id int(11)
customer_policy_id int(11)
date_of_claim date
amount_of_claim float

> one or many to one(and only one) towards Customer_policy

Customer_policy

id int(11)
policy_start_date date
policy_renewal_date date
policy_id int(11)
customer_id int(11)
agent_id(11)

> one or many to one (and only one) towards Customer

Customer

id int(11)
first_name varchar(30)
last_name varchar(30)
email varchar(30)
address_id int(11)

输出应如下所示:

customer_name   amount_of_claim
abhinav         195000

这是我尝试过的:

CREATE TRIGGER claim_audits on claims 
for insert
as
    declare @custname varchar(25);
    declare @amount varchar(25);
    declare @action varchar(25);
    
    select @custname = first_name from customer c
    join inserted i on i.id=c.id;
    select @amount = i.amount_of_claim from inserted i;
    select @action = 'Updated customer claimed amount';
    
    insert into claim_audits values(@custname , @amount , @action);
    select * from claim_audits; 
go

【问题讨论】:

  • 您需要做的第一件事是阅读 Inserted and Deleted pseudo-tables,因为它们可以有 0-N 行...而不仅仅是 1。您注意到哪些触发器无法正常工作?为什么最后选择* from claim_audits?在触发器中选择是非常糟糕的做法......您要完成什么。
  • @DaleK 但是这不会只在插入查询后触发,所以它总是至少有一条记录??
  • 如果它有 2 条记录怎么办?如果它有 0 条记录怎么办?
  • amount_of_claim float float 是近似值。请改用decimalnumeric
  • @ShubhamPanwar 如果客户有多项索赔,也将总索赔金额放在我看来毫无意义。但我想这真的归结为,你用这个审计表做什么?

标签: sql sql-server tsql triggers


【解决方案1】:

Inserted 伪表可以有 0-N 行,您需要处理它。与任何与 SQL 相关的内容一样,您应该使用基于集合的方法而不是过程方法来处理它。

您似乎也没有正确获取客户 ID - 至少根据您的表定义。我必须说,将客户的名字存储在您的审计表中是非常奇怪的。为什么不存储客户 ID?该名称不是唯一的,因此您没有提供可靠的审计线索。

create trigger claim_audits
on claims
for insert
as
begin
    set nocount on;

    insert into dbo.claim_audits (custname, amount, [action])
        select C.first_name, I.amount_of_claim, 'Updated customer claimed amount'
        from Inserted I
        inner join Customer_Policy CP on CP.id = I.customer_policy_id
        inner join Customer C on C.id = CP.customer_id;
end;

注意 - 您不想尝试从触发器返回数据。

正如@Squirral 所指出的:amount_of_claim float:float 是一个近似值,不应该用来赚钱。请改用小数或数字。

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2020-01-01
    • 2012-08-14
    • 1970-01-01
    • 2015-03-16
    • 2016-09-15
    相关资源
    最近更新 更多