我们有一个基于SQL Server的旧数据库,该触发器的触发器设置为在创建行以及以后对其进行修改时更新created_by,created_on,modified_by和modified_on列。已为创建的*列设置了默认值,并且为已修改的*列设置了触发器。
这样做是为了管理创建和更新事件,这些事件是通过不同的前端发生的,甚至应该通过SQL Server工具集(SSMS)发生。
我现在正在其中一些表上构建基于内部Django的内部前端应用程序,并且最初将Django Admin Interface用于这些表上基于CRUD的活动。
我遇到的问题是,由于Django Web App正在使用具有数据库特权的Windows服务帐户连接到数据库,因此ModifiedBy触发器正在使用该服务用户帐户而不是WebApp最终用户帐户来标识“谁'已更新一行。我明白为什么。但是想知道是否有人能够以某种方式强制触发器使用原始Webapp最终用户,而不是使用Django内部建立连接的帐户?
该设置是Windows环境,Apache提供了Django 2.x框架的虚拟主机。 Windows身份验证用于SQL Server。我们还设置了ADFS,以消除内部用户重新输入凭据的需要。相反,我们使用AD组成员身份来限制或授予对该应用程序的访问权限。
触发器已经存在,即使我们将会话请求“用户名”传递给模型,在更新后触发触发器时,触发器也会将其覆盖。
我曾考虑过在save()之前禁用触发器,并在save()的末尾启用它,但我想如果更新到同一张表(尽管行不同),则会使我们暴露使用Django应用程序在另一个会话中使用另一个应用程序,甚至可能是另一个用户。总的来说,这似乎是有问题的,一旦出现问题就很难追踪。
我还考虑过使用webApp最终用户对数据库而不是服务帐户进行身份验证。我在https://blog.markhepburn.com/2010/02/07/per-user-database-authentication-in-django找到了可能的解决方案。但这取决于最终用户凭证以纯文本形式存储在会话中,并且鉴于该凭证已在2010年实施,我希望可以有一个更新的解决方案。
预先感谢
示例触发器类似于
CREATE TRIGGER [dbo].[TRU_Product_Audit]
ON [dbo].[Product]
AFTER UPDATE
AS
BEGIN
IF(COLUMNS_UPDATED())>0
BEGIN
UPDATE pr
SET pr.ModifiedOn=GETDATE(),
pr.ModifiedBy=SUSER_SNAME()
FROM INSERTED i
INNER JOIN [dbo].[Product] pr
ON pr.ProductID=i.ProductID
END
END
GO