建立审计体系;SQL Server 后端上的 MS Access 前端

Building an auditing system; MS Access frontend on SQL Server backend

提问人:Andrew G. Johnson 提问时间:8/16/2008 最后编辑:CommunityAndrew G. Johnson 更新时间:5/17/2013 访问量:4393

问:

所以基本上我正在为我的公司构建一个应用程序,它需要使用 MS Access 构建,并且需要在 SQL Server 上构建。

我已经制定了大部分计划,但很难找到处理审计系统的方法。

由于它仅在内部使用,您甚至无法从建筑物外部触摸数据库,因此我们不使用登录系统,因为只有在用户已经通过Active Directory登录到我们的内部网络时,才会使用该程序。知道了这一点,我们正在使用一个系统来自动检测 Active Directory 用户的名称及其在其中一个数据库表中的权限,从而决定他们可以做什么或不能做什么。

因此,实际的审计表将有 3 列(此设计可能会更改,但对于此问题无关紧要);谁(Active Directory 用户)、何时(添加/删除/编辑时间)、什么(更改了什么)

我的问题是我应该如何处理这个问题。理想情况下,我知道我应该使用触发器,以便在不记录审核的情况下无法更新数据库,但是我不知道如何以这种方式获取 Active Directory 用户。另一种方法是将其直接编码到 Access 源代码中,以便每当发生更改时,我都会运行 INSERT 语句。显然,这是有缺陷的,因为如果 Access 发生问题或数据库被其他东西触及,那么它不会记录审核。

任何可能对我有帮助的建议、示例或文章将不胜感激!

sql sql-server ms-access 触发器

评论

0赞 Andrew G. Johnson 2/13/2011
呃,不起作用,仍然通过触发器添加相同的东西。另外,我应该提到我正在使用 ODBC 进行连接......

答:

0赞 Kev 8/16/2008 #1

该应用程序将有多少用户?是否可以使用 Windows 集成身份验证进行 SQL 身份验证?

更新:如果可以为每个用户提供 SQL 登录名(Windows 集成),则可以使用 SYSTEM_USER 功能选取登录用户。

评论

0赞 Andrew G. Johnson 2/13/2011
@KevinKenny我会说 10-30 之类的东西,未来可能会更多。我从未真正听说过或使用过 SQL Server 的 Windows 集成身份验证。它简单/安全吗?这样的事情对老板来说可能更难推销。:/
2赞 Jay Mooney 8/16/2008 #2

这对你有用吗?


select user_name(),suser_sname()

哎呀!我忘了转义我的代码。

0赞 SQLMenace 8/16/2008 #3

它应该是

select user name(),suser sname()

用下划线替换空格

评论

0赞 Andrew G. Johnson 2/13/2011
哈哈,多么尴尬,这也回答了我不成文的问题,即斜体是怎么回事?我不确定这些是否有效,或者只是返回我用于将 Access 应用程序连接到数据库的用户名,这对每个人都是一样的 - 有没有办法以某种方式使用 Active Directory 作为 SQL Server 身份验证过程的一部分?无论如何,我将运行一些测试以确保确实如此。
1赞 Jay Mooney 8/16/2008 #4

如果您在 Sql 的连接字符串中指定 SSPI,我认为已提供您的 Windows 凭据。

评论

0赞 Andrew G. Johnson 2/13/2011
是的,这 2 个命令做了我怀疑的事情,只是为每个人返回了同样的东西。我没有使用连接字符串;正如我之前所说,我正在使用 Access,并且只是使用链接表连接到我的数据库。
0赞 SQLMenace 8/16/2008 #5

您需要使用集成安全性(又称可信连接)进行连接,请参阅(http://www.connectionstrings.com/?carrier=sqlserver)

评论

0赞 Andrew G. Johnson 2/13/2011
这是唯一的办法吗?我是否必须更改链接表的整个模型?老实说,我什至不知道如何将连接字符串集成到 Access 中......
1赞 Jay Mooney 8/16/2008 #6

我试着玩了一下 Access,看看我是否能找到适合你的方法。我认为您可以为 SQL 表指定一个新的数据源,并选择 Windows NT 身份验证作为连接类型。

评论

0赞 Andrew G. Johnson 2/13/2011
杰伊,你能详细介绍一下你是怎么做到的吗?呵呵,只是为了开始,我并不完全遵循你。不过,这是否仍然有效,我仍然需要向 SQL Server 进行身份验证才能运行查询。
1赞 Jay Mooney 8/16/2008 #7

当然:)

Access 中应该有一个名为“外部数据”的部分(我正在运行新版本的 Access,因此菜单选项可能会有所不同)。

为此,应该有一个选项来指定 ODBC 连接。

我可以选择通过创建链接表来链接到数据源。

然后,我创建了一个 Machine 数据源。我从下拉列表中选择了 SqlServer。然后,当我单击“下一步”时,系统会提示我如何进行身份验证。

1赞 Andrew G. Johnson 8/16/2008 #8
CREATE TRIGGER testtrigger1
ON testdatatable
AFTER update
AS 
BEGIN
    INSERT INTO testtable (datecol,usercol1,usercol2) VALUES (getdate(),user_name(),suser_sname());
END
GO
2赞 Jay Mooney 8/16/2008 #9

好的,它在这里工作。当我更新表时,我看到了我的 Windows 凭据。所以,我敢打赌我们错过了一步。让我把我所做的事情放在一起的 1、2、3 序列,也许我们可以追踪到这对你来说是什么。


  1. 创建新的 MSAccess 数据库(空)
  2. 单击表格部分
  3. 选择外部数据
  4. 选择 ODBC 数据库
  5. 通过创建链接表来选择链接到数据源
  6. 选择计算机数据源
  7. 选择新的...
  8. 系统数据源
  9. 从列表中选择“SQL Server”,然后单击“下一步”和“完成”。
  10. 为新数据源指定名称和说明,然后选择“(本地)”作为服务器。单击“下一步”。
  11. 选择“使用网络登录 ID 进行 Windows NT 身份验证”。单击“下一步”。
  12. 选中“将默认数据库更改为”,然后选择数据库。单击“下一步”。单击 Finish。
  13. 测试数据源。
  14. 选择与触发器关联的表,然后单击确定。
  15. 在 Access 中打开表并修改其中一个条目(触发器不会在插入时触发,只会在更新时触发)
  16. 从审核表中选择 *

评论

0赞 Andrew G. Johnson 2/13/2011
好吧,显然我是个白痴,因为它似乎在起作用。我想在其他帐户上尝试它,但当然没有安装Access的人仍然在这里,我无法创建新帐户。呃,无论如何应该可以工作 - 最终结果将在周一发布!感谢所有的帮助。
1赞 Mark Plumpton 9/16/2008 #10

我们还有一个数据库系统,专门在组织内部使用,并使用 Window NT 登录。此函数返回当前用户的登录名:

CREATE FUNCTION dbo.UserName() RETURNS varchar(50)
AS
    BEGIN
    RETURN  (SELECT nt_username FROM master.dbo.sysprocesses WHERE spid = @@SPID)
    END

您可以在触发器中使用此功能。

0赞 Ricardo C 9/16/2008 #11

我的解决方案是不要让 Access 修改带有链接表的数据。

我只会在 Access 中创建 UI,并使用连接字符串中经过身份验证的窗口创建与服务器的 ADO 连接。将 Access 应用程序编译为 dbe 以保护 VB 代码。

我不会发出 SQL 语句,但我会调用存储过程来执行数据库中的更改,并在原子事务中创建审核日志条目。

UI(Access)不需要知道服务器上的内部工作。它所需要做的就是使用为此目的创建的存储过程进行请求和更新/插入/删除。服务器应处理该工作。

使用在服务器中实现的带有提示 NOLOCK 的视图检索带有 ADO 的记录集,并在 Access 中缓存此数据以供本地显示。或者检索单个记录并仅锁定该行进行编辑。

使用链接表,您的用户将相互锁定。

使用 ADO 连接,您不必在每个客户端上设置 ODBC。

创建一个表来设置服务器状态。您的应用程序将在执行任何操作之前对其进行检查。 您可以使用它来关闭应用程序的服务器,以防您需要执行更改或维护。

Access 是一个很棒的工具。但它应该只处理其本地数据,而不允许弄乱宝贵的服务器。