4

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

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

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

所以实际的审计表将有 3 列(这个设计可能会改变,但对于这个问题没关系);谁(Active Directory 用户)、何时(添加/删除/编辑时间)、什么(更改了什么)

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

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

4

11 回答 11

2

这对你有用吗?


select user_name(),suser_sname()

嗬!我忘了逃避我的代码。

于 2008-08-15T19:44:23.013 回答
2

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


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

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

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

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

于 2008-09-15T23:24:36.363 回答
1

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

于 2008-08-15T19:53:32.167 回答
1

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

于 2008-08-15T20:07:23.950 回答
1

当然 :)

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

形成这个应该有一个选项来指定一个 ODBC 连接。

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

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

于 2008-08-15T20:14:30.097 回答
1
CREATE TRIGGER testtrigger1
ON testdatatable
AFTER update
AS 
BEGIN
    INSERT INTO testtable (datecol,usercol1,usercol2) VALUES (getdate(),user_name(),suser_sname());
END
GO
于 2008-08-15T20:46:22.840 回答
0

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

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

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

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

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

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

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

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

访问是一个很棒的工具。但它应该只处理它的本地数据,而不是被允许与宝贵的服务器混为一谈。

于 2008-09-16T03:02:04.530 回答
0

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

更新:如果您可以为每个用户提供 SQL 登录名(集成 Windows),那么您可以使用 SYSTEM_USER 函数获取已登录的用户。

于 2008-08-15T19:40:43.787 回答
0

它应该是

select user name(),suser sname()

用下划线替换空格

于 2008-08-15T19:49:23.300 回答
0

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

于 2008-08-15T20:02:55.533 回答