建立审计制度; SQL Server后端上的MS Access前端
因此,基本上,我正在为我的公司构建一个应用程序,它需要使用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。
创建一个表以设置服务器状态。应用程序将在执行任何操作之前对其进行检查。如果需要执行更改或者维护,可以使用它来关闭服务器到应用程序的位置。
访问是一个很棒的工具。但是它只应处理其本地数据,而不能与珍贵的服务器打交道。