提问人:Andrew G. Johnson 提问时间:8/16/2008 最后编辑:CommunityAndrew G. Johnson 更新时间:5/17/2013 访问量:4393
建立审计体系;SQL Server 后端上的 MS Access 前端
Building an auditing system; MS Access frontend on SQL Server backend
问:
所以基本上我正在为我的公司构建一个应用程序,它需要使用 MS Access 构建,并且需要在 SQL Server 上构建。
我已经制定了大部分计划,但很难找到处理审计系统的方法。
由于它仅在内部使用,您甚至无法从建筑物外部触摸数据库,因此我们不使用登录系统,因为只有在用户已经通过Active Directory登录到我们的内部网络时,才会使用该程序。知道了这一点,我们正在使用一个系统来自动检测 Active Directory 用户的名称及其在其中一个数据库表中的权限,从而决定他们可以做什么或不能做什么。
因此,实际的审计表将有 3 列(此设计可能会更改,但对于此问题无关紧要);谁(Active Directory 用户)、何时(添加/删除/编辑时间)、什么(更改了什么)
我的问题是我应该如何处理这个问题。理想情况下,我知道我应该使用触发器,以便在不记录审核的情况下无法更新数据库,但是我不知道如何以这种方式获取 Active Directory 用户。另一种方法是将其直接编码到 Access 源代码中,以便每当发生更改时,我都会运行 INSERT 语句。显然,这是有缺陷的,因为如果 Access 发生问题或数据库被其他东西触及,那么它不会记录审核。
任何可能对我有帮助的建议、示例或文章将不胜感激!
答:
该应用程序将有多少用户?是否可以使用 Windows 集成身份验证进行 SQL 身份验证?
更新:如果可以为每个用户提供 SQL 登录名(Windows 集成),则可以使用 SYSTEM_USER 功能选取登录用户。
评论
这对你有用吗?
select user_name(),suser_sname()
哎呀!我忘了转义我的代码。
它应该是
select user name(),suser sname()
用下划线替换空格
评论
如果您在 Sql 的连接字符串中指定 SSPI,我认为已提供您的 Windows 凭据。
评论
您需要使用集成安全性(又称可信连接)进行连接,请参阅(http://www.connectionstrings.com/?carrier=sqlserver)
评论
我试着玩了一下 Access,看看我是否能找到适合你的方法。我认为您可以为 SQL 表指定一个新的数据源,并选择 Windows NT 身份验证作为连接类型。
评论
当然:)
Access 中应该有一个名为“外部数据”的部分(我正在运行新版本的 Access,因此菜单选项可能会有所不同)。
为此,应该有一个选项来指定 ODBC 连接。
我可以选择通过创建链接表来链接到数据源。
然后,我创建了一个 Machine 数据源。我从下拉列表中选择了 SqlServer。然后,当我单击“下一步”时,系统会提示我如何进行身份验证。
CREATE TRIGGER testtrigger1
ON testdatatable
AFTER update
AS
BEGIN
INSERT INTO testtable (datecol,usercol1,usercol2) VALUES (getdate(),user_name(),suser_sname());
END
GO
好的,它在这里工作。当我更新表时,我看到了我的 Windows 凭据。所以,我敢打赌我们错过了一步。让我把我所做的事情放在一起的 1、2、3 序列,也许我们可以追踪到这对你来说是什么。
- 创建新的 MSAccess 数据库(空)
- 单击表格部分
- 选择外部数据
- 选择 ODBC 数据库
- 通过创建链接表来选择链接到数据源
- 选择计算机数据源
- 选择新的...
- 系统数据源
- 从列表中选择“SQL Server”,然后单击“下一步”和“完成”。
- 为新数据源指定名称和说明,然后选择“(本地)”作为服务器。单击“下一步”。
- 选择“使用网络登录 ID 进行 Windows NT 身份验证”。单击“下一步”。
- 选中“将默认数据库更改为”,然后选择数据库。单击“下一步”。单击 Finish。
- 测试数据源。
- 选择与触发器关联的表,然后单击确定。
- 在 Access 中打开表并修改其中一个条目(触发器不会在插入时触发,只会在更新时触发)
- 从审核表中选择 *
评论
我们还有一个数据库系统,专门在组织内部使用,并使用 Window NT 登录。此函数返回当前用户的登录名:
CREATE FUNCTION dbo.UserName() RETURNS varchar(50)
AS
BEGIN
RETURN (SELECT nt_username FROM master.dbo.sysprocesses WHERE spid = @@SPID)
END
您可以在触发器中使用此功能。
我的解决方案是不要让 Access 修改带有链接表的数据。
我只会在 Access 中创建 UI,并使用连接字符串中经过身份验证的窗口创建与服务器的 ADO 连接。将 Access 应用程序编译为 dbe 以保护 VB 代码。
我不会发出 SQL 语句,但我会调用存储过程来执行数据库中的更改,并在原子事务中创建审核日志条目。
UI(Access)不需要知道服务器上的内部工作。它所需要做的就是使用为此目的创建的存储过程进行请求和更新/插入/删除。服务器应处理该工作。
使用在服务器中实现的带有提示 NOLOCK 的视图检索带有 ADO 的记录集,并在 Access 中缓存此数据以供本地显示。或者检索单个记录并仅锁定该行进行编辑。
使用链接表,您的用户将相互锁定。
使用 ADO 连接,您不必在每个客户端上设置 ODBC。
创建一个表来设置服务器状态。您的应用程序将在执行任何操作之前对其进行检查。 您可以使用它来关闭应用程序的服务器,以防您需要执行更改或维护。
Access 是一个很棒的工具。但它应该只处理其本地数据,而不允许弄乱宝贵的服务器。
评论