是否可以编写一个接受外部参数的触发器?
这样做的主要原因是,我只能使用 一个 数据库用户来连接数据库。现在,我正在开发数据库应用程序,并为每个单独的表创建了触发器以存储历史记录。
虽然存储历史数据,我想存储 应用程序的用户名 谁做的Insert,Update或Delete。我想用User_Name(),但才知道,它只返回数据库用户, 不 应用程序的用户。
Insert
Update
Delete
User_Name()
因此,我正在寻找有关使用外部参数创建触发器的一些建议,以便可以将应用程序用户的ID传递给该触发器。认为我已经清楚地解释了我的需求。提前致谢 !
编辑 外部参数应该类似于可以传递值的存储过程参数
Edit2 可能是我的描述不够清楚。因此,我举一个例子。 我正在开发的Web应用程序与帐户相关。因此要跟踪所需的数据更改。例如,客户人员可以更改员工的薪水和佣金信息。如果输入/更新了错误的信息,则整个财务结果将产生很大的负面影响。现在,在系统中,用户使用用户ID和密码登录到系统,然后对员工信息进行一些更改。在此阶段,我要跟踪谁更改了员工信息,更改的时间以及更改前的值以及更改后的值。这样,将来如果发生任何错误,我就可以找出使用PROOF出错的用户。 不一定必须使用触发器来完成,但是也欢迎使用其他任何替代方法。
您需要重新设计您的方法。数据库无法 只知道 有关您的应用程序用户信息的任何信息。而且,不,您不能将参数传递给触发器。但是您可以通过触发来引用您自己的表,因此有一种方法…
当您连接到数据库时,每个连接都会获得其自己的进程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以外的任何信息。