建立审计制度; SQL Server后端上的MS Access前端

时间:2020-03-05 18:39:57  来源:igfitidea点击:

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

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

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

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

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

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

解决方案

回答

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

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

回答

这对我们有用吗?

select user_name(),suser_sname()

h!我忘记了自己的代码。

回答

它应该是

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,然后单击"下一步","完成"。
  • 为新的数据源命名和描述,然后为服务器选择(本地)。点击下一步。
  • 选择"使用Windows NT身份验证使用网络登录ID"。点击下一步。
  • 选中将默认数据库更改为,然后选择数据库。点击下一步。单击完成。
  • 测试数据源。
  • 选择与触发器关联的表,然后单击"确定"。
  • 在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,并使用在连接字符串中经过身份验证的Windows创建到服务器的ADO连接。将Access应用程序编译为dbe以保护VB代码。

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

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

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

使用链接表,用户将彼此锁定。

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

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

访问是一个很棒的工具。但是它只应处理其本地数据,而不能与珍贵的服务器打交道。