admin

如何在SQL Server中创建接受外部参数的触发器?

sql

是否可以编写一个接受外部参数的触发器?

这样做的主要原因是,我只能使用 一个 数据库用户来连接数据库。现在,我正在开发数据库应用程序,并为每个单独的表创建了触发器以存储历史记录。

虽然存储历史数据,我想存储 应用程序的用户名
谁做的InsertUpdateDelete。我想用User_Name(),但才知道,它只返回数据库用户, 应用程序的用户。

因此,我正在寻找有关使用外部参数创建触发器的一些建议,以便可以将应用程序用户的ID传递给该触发器。认为我已经清楚地解释了我的需求。提前致谢 !

编辑
外部参数应该类似于可以传递值的存储过程参数

Edit2
可能是我的描述不够清楚。因此,我举一个例子。
我正在开发的Web应用程序与帐户相关。因此要跟踪所需的数据更改。例如,客户人员可以更改员工的薪水和佣金信息。如果输入/更新了错误的信息,则整个财务结果将产生很大的负面影响。现在,在系统中,用户使用用户ID和密码登录到系统,然后对员工信息进行一些更改。在此阶段,我要跟踪谁更改了员工信息,更改的时间以及更改前的值以及更改后的值。这样,将来如果发生任何错误,我就可以找出使用PROOF出错的用户。
不一定必须使用触发器来完成,但是也欢迎使用其他任何替代方法。


阅读 161

收藏
2021-06-07

共1个答案

admin

您需要重新设计您的方法。数据库无法 只知道
有关您的应用程序用户信息的任何信息。而且,不,您不能将参数传递给触发器。但是您可以通过触发来引用您自己的表,因此有一种方法…

当您连接到数据库时,每个连接都会获得其自己的进程ID。您可以通过@@ spid获得此信息。

因此,当触发器触发时,您可以使用它来知道是哪个连接导致了更改。

您可以使用相同的数据库登录名进行100个并发连接,并且每个连接都有其自己的@@ spid值。

为了使它对您有用,您需要准备所有连接。每次建立连接时,您的应用程序都应写入表中,以记录使用该@@ spid的应用程序的用途。

也许像…这样简单

CREATE TABLE
  map_spid_application_user (
    spid          BIGINT,
    application   VARCHAR(128),
    user          VARCHAR(128),
    PRIMARY KEY (spid)
  )

然后,在每个连接上,运行类似这样的内容(可能通过存储过程)…

DELETE map_spid_application_user WHERE spid = @@spid

INSERT INTO map_spid_application_user SELECT @@spid, 'myApp', 'myUser'

然后,在触发器中,您可以在此表上引用/联接以查找@@ spid引用的人。

您还可以变得更聪明,并使用类似的方法来永久记录用户连接的内容(如spid)。任何spid的当前用户将始终是连接日期时间最近的用户。

那时您几乎可以做任何事情。因为您正在创建所有信息,而不是依靠数据库 仅知道 @@ spid以外的任何信息。

2021-06-07