Questions tagged «audit»

数据库审核涉及观察数据库,以便了解数据库用户的操作。

9
如何在数据库中处理删除?
我想在Web应用程序中实现“取消删除”功能,以便用户可以改变主意并恢复已删除的记录。关于如何实施的想法?我考虑过的一些选项实际上是删除有问题的记录,并将更改存储在单独的审核表中,或者不删除记录,而是使用布尔“已删除”列将其标记为已删除。后一种解决方案在正常情况下将需要附加的应用程序逻辑来忽略“已删除”的记录,但将使在应用程序端恢复记录变得容易得多。

4
如何找出谁删除了一些SQL Server数据
我的老板昨天从一个客户那里询问,询问他们如何找到谁删除了他们在SQL Server数据库中的某些数据(如果重要的话,这是速成版)。 我以为可以从事务日志中找到它(假设它没有被截断)-这正确吗?如果是这样,您实际上将如何找到这些信息?


2
设计数据库和表以保留更改记录的最佳方法?
我需要在项目上设置历史记录功能,以跟踪先前的更改。 假设我现在有两个表: NOTES TABLE (id, userid, submissionid, message) SUBMISSIONS TABLE (id, name, userid, filepath) 示例:我在注释中有一行,并且用户想要更改消息。我想跟踪更改之前和更改之后的状态。 在这些表中的每个表上设置一列的最佳方法是什么,该列将说明某项是否“旧”。0,如果活性OR 1,如果删除/不可见。 我还想创建一个历史记录(AUDIT TRAIL)表,其中包含id先前状态的,id新状态的,这些ID与哪个表有关?

1
我可以告诉何时和谁在Azure上将数据库从v11更新到v12吗?
今天早些时候,我注意到我所有的Azure SQL数据库服务器都从v11更新到了v12。我是公司中唯一应触摸这些拨盘的人,但不是公司中唯一具有访问权限的人。由于我没有启动此升级,因此我想找出是谁进行的以及何时进行此计划外的更新。 我知道我可以给公司的每个人写一封电子邮件,并且可以礼貌地向WTF询问信息,但是我宁愿以尽可能多的事实开始对话。另外,我倾向于认为这是Microsoft / Azure SNAFU,因为升级所有服务器都太刻意了。

5
电子商务订单表。节省价格,还是使用审核/历史记录表?
我正在设计我的第一个电子商务模式。我已经阅读了一段时间,对an order_line_item和a 之间的关系有些困惑product 一个product可以被购买。它具有各种细节,但最重要的是unit_price。 在客户购买产品时,An order_line_item具有product_id购买,quantity购买和购买时的外键unit_price。 我读过的大部分内容都说unit_price上的order_line_item应该显式添加(即,不通过引用product_id)。这是有道理的,因为商店将来可能会更改价格,这会弄乱订单报告,跟踪,完整性等。 我不明白的是,为什么直接将unit_price值保存到order_line_item? 创建记录unit_price变更记录的审计/历史记录表会更好product吗? order_line_item创建an时,将product_audit添加表的外键,并可以从此处检索价格(通过引用)。 在我看来,使用这种方法有很多好处(减少数据重复,更改价格历史记录等),那么为什么不更频繁地使用它呢?我没有遇到使用这种方法的电子商务模式的示例,我错过了什么吗? UDPATE:看来我的问题与尺寸变化缓慢有关。我仍然很困惑,因为“缓慢变化的维度”与数据仓库和OLAP有关。那么,是否可以将“缓慢更改维度”类型应用于我的主要业务交易流程数据库(OLTP)?我想知道我是否将很多概念混在一起,将不胜感激一些指导。

1
如何从SQL Server审核数据中筛选出标量值用户定义的函数用法?
我们有一个SQL Server数据库,该数据库具有数据库审核规范,该规范审核数据库上所有执行的操作。 CREATE DATABASE AUDIT SPECIFICATION [dbAudit] FOR SERVER AUDIT [servAudit] ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public]) 我们发现,某些查询将对结果集中的每一行使用标量函数写入审核日志。当发生这种情况时,在将日志ETL放入最终的静止位置之前,日志已填满,并且日志记录中存在空白。 不幸的是,由于合规性原因,我们不能简单地停止审核每条EXECUTE声明。 解决此问题的方法首先想到的是使用WHERE“ 服务器审核”上的子句来过滤活动。代码如下所示: WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' ) 不幸的是,SQL Server不允许使用关系IN运算符(可能是因为它不想在每次必须写入审核日志时都进行查询)。 我们想避免编写一个存储过程,其硬代码object_id中WHERE条款,但是这是我们在解决这个问题的最好办法目前的想法。我们是否应该考虑替代方法? 我们注意到,当在递归CTE中使用标量函数时,它将导致查询将查询写入结果集中的每一行。 供应商提供了一些标量值函数,我们无法删除或移动到备用数据库。

3
在不使用触发器的情况下,在SQL Server中查找触发查询的客户端的身份?
我目前正在使用Change Data Capture(CDC)来跟踪数据更改,并且希望跟踪提交进行了更改的查询的客户端的主机名和IP地址。如果有5个不同的客户端通过相同的用户名登录,则一个客户端将面临跟踪5个客户端中的哪一个引发查询的难题。我发现的其他可能的解决方案包括使用以下命令更改CDC表: ALTER TABLE cdc.schema_table_CT ADD HostName nvarchar(50) NULL DEFAULT(HOST_NAME()) 但是,这将返回在其上触发查询的服务器的主机名,而不是触发该查询的客户端的主机名。 有办法解决这个问题吗?这将有助于记录客户端的主机名或IP地址(或其他唯一身份)。我不想使用触发器,因为它会减慢系统速度,而且CDC还会生成系统表,因此显然不可能在上面设置触发器。

3
将有关已删除记录的信息传递到“删除”触发器上
在设置审计跟踪时,我没有问题可以跟踪谁在更新或在表中插入记录,但是,跟踪谁删除记录似乎更成问题。 我可以通过在“插入/更新”字段中包含“ UpdatedBy”字段来跟踪插入/更新。这使INSERT / UPDATE触发器可以通过来访问字段“ UpdatedBy” inserted.UpdatedBy。但是,使用Delete触发器不会插入/更新数据。有没有一种方法可以将信息传递到Delete触发器上,以便它可以知道谁删除了记录? 这是一个插入/更新触发器 ALTER TRIGGER [dbo].[trg_MyTable_InsertUpdate] ON [dbo].[MyTable] FOR INSERT, UPDATE AS INSERT INTO AuditTable (IdOfRecordedAffected, UserWhoMadeChanges) VALUES (inserted.ID, inserted.LastUpdatedBy) FROM inserted 使用SQL Server 2012

4
审核MySQL数据库上的登录
有没有办法审核MySQL的登录信息?我希望能够为每个员工创建一个用户名,从而创建登录的审计线索。但是,谷歌搜索并没有取得好的结果。 我们可以审核的越多越好。至少,很高兴知道谁何时登录。最好查看谁在何时执行什么查询。因为数据库中存在潜在的敏感信息,所以那里的日志主要是告诉客户我们拥有它们。 显然,能够审核每个用户(和何时)执行的查询也将使我们能够更好地确定如果出现安全问题的原因是谁。


2
扩展事件与SQL审核-性能影响
我想在数据库上设置一个审计跟踪类型的系统,以监视UPDATE/INSERT活动非常活跃的特定表上的语句。我面前有两个选择:使用SQL Server内置的Audit系统或使用扩展事件。 由于SQL Server审核在内部使用扩展事件,因此我假设直接使用审核而不是扩展事件会产生某种开销。 我有什么办法可以做一些测试来分析哪个系统对服务器的影响更大?如果我知道创建任何XE会话时实际发生的情况,它将有助于我分析对服务器的影响。 我们考虑了触发器,但由于开销而忽略了该选项。但这只是基于Internet上的信息而决定的。

3
使用共享登录名时,如何知道用户对审核表执行删除操作?
背景资料: 我正在创建审核表的集合,以跟踪对我的应用程序的一组数据表的更新和删除。 审计记录是通过触发器创建的。 我的应用程序数据库中的DML通常来自服务用于进入数据库的登录名。因此,我认为SYSTEM_USER在触发器中调用时,结果始终是相同的。 我的应用程序当前不存储用户数据,尽管UserId每次执行DML时都会为其分配一个字符串(仅在存储过程中完成)。 我遇到的问题是,当用户删除记录时,我想知道是谁做的。因为它将通过相同的登录完成,所以我不想看到所有操作都是由服务完成的,所以我想看看哪个用户做了。这不是更新的问题,因为我们有一些ModifiedBy列会通过发送更新来UserId更新。 问题是:SYSTEM_USER运行删除操作时,有没有办法将用户信息设置为或以其他方式使用户信息进入触发器? 我现在拥有的“最佳”想法(尽管我不确定这是否是一个好主意)是,在服务中,我检查是否当前UserId作为用户存在于数据库中,如果不是,则创建一个用户为他们反对。然后使用运行存储过程EXECUTE AS User = @UserId。然后,当在存储过程中完成DML并触发触发器时,SYSTEM_USER应从中返回用户EXECUTE AS。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.