使用Django模型保存时有关管理数据库表触发器的建议

时间:2019-04-02 06:56:08

标签: sql-server django triggers model

我们有一个基于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

0 个答案:

没有答案