我听说过关于生活在数据库触发器中的小鬼的各种恐怖故事,而且——更糟糕的是——系统因添加触发器而导致一连串级联事件而崩溃。
我正在考虑实施关于使用数据库触发器的严格政策。对于关注点分离,最初的想法是说:
“数据库触发器应仅用于捕获和维护审计跟踪的目的。”
我正在研究 SQL Server 审计的工作原理,并希望对 QUEUE_DELAY 选项的工作原理有所了解。BOL 将选项定义为:
确定在强制处理审计操作之前可以经过的时间(以毫秒为单位)。值 0 表示同步传送。可设置的最小查询延迟值为 1000(1 秒),这是默认值。最大值为 2,147,483,647(2,147,483.647 秒或 24 天 20 小时 31 分 23.647 秒)。指定无效数字将引发错误 MSG_INVALID_QUEUE_DELAY。
这些操作在哪里排队 tempdb、系统表等?我可以查询该位置以查看队列中有多少项目吗?如果将 ON_FAILURE 选项设置为关闭服务器,一旦服务器重新启动并且可以再次访问该位置,这些项目是否会被记录到审计中?
在新项目的数据库中,我已经开始约定让每个表都有一个最后修改的时间戳列。为了实现这一点,我为每个表编写了一个触发器:
CREATE TRIGGER touch_users
BEFORE UPDATE
ON users
FOR EACH ROW
WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
EXECUTE PROCEDURE touch_modification_time();
CREATE TRIGGER touch_company
BEFORE UPDATE
ON company
FOR EACH ROW
WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
EXECUTE PROCEDURE touch_modification_time();
-- etc for each table
Run Code Online (Sandbox Code Playgroud)
这很快就会变得乏味;特别是因为它们完全相同,除了表名。
有没有办法可以减少每个表所需的样板文件?或者甚至可能通过一个默认作用于每个表的触发器完全消除它?
我不是受过训练的 DBA,但我管理一个使用 SQL Server 作为后端的软件应用程序。应用程序管理“项目”,每个项目都有自己的数据库。
由于通过应用程序报告的限制,我们设置了一个对所有项目数据库具有只读权限的通用 SQL Server 用户帐户。用户利用该帐户通过 ODBC 进行连接并执行查询。
现在我想审计这些连接——它们何时发生以及连接到哪个数据库。
有人可以帮助我吗?
我对 SQL Server 本身具有管理访问权限。我对 SQL 语法有非常基本的了解。不过,我完全不了解 SQL Server 的审计功能。
提前致谢!
对于监管和欺诈要求,我们需要记录对 DB 中大多数表的每次更改。我们在以前的项目中非常成功地做到这一点的方法是拥有每个表的副本,除了:
在以前的工作中,Oracle DBA 编写了一个脚本来自动生成所有这些,它执行以下操作:
笔记:
该系统的美妙之处在于您可以查询更改的内容和时间,或者谁对哪些内容进行了更改,并查看更改前后的记录。更改发生在 DB 行级别,而不是单个列级别。
有没有人在 MYSQL 5.6 中遇到过这样的事情?我们团队中没有 DBA 可以从头开始编写这样的东西,但我们知道足以修改类似的东西。
我们需要审计数据库管理员对客户数据库的访问——至少,知道他们正在访问哪个客户数据库(最好是为什么)。如果不升级到 SQL Enterprise 或安装 GreenSQL 之类的代理,是否有其他选择可供我们选择?
例如,我正在考虑某种特权脚本,它提升(sudo 风格)您访问数据库的权限,将其记录到事件日志中,然后再减少它们。
有没有办法实现这一点,可以可靠地审计?我们还应该考虑其他方法吗?
我在数据库中通过清理看到以下数量的登录、注销和注销:
SQL> select action_name, count(*) qty
from Dba_audit_session
group by action_name
order by 1; 2 3 4
ACTION_NAME QTY
--------------------------- ----------
LOGOFF 1946180
LOGOFF BY CLEANUP 754683
LOGON 1026
Run Code Online (Sandbox Code Playgroud)
登录少于注销的 0.1% 是没有意义的。
任何想法为什么?
我曾经在一家拥有第三方数据仓库解决方案的公司工作。显然所有的对象和表都隐藏在支持数据库中,所以我不清楚某些存储过程中究竟发生了什么。我在那里看到了这个有趣的存储过程,并想在我自己的解决方案中复制它,但我无法理解它是如何工作的。我正在描述下面的存储过程,如果有人能给我一些关于如何实现这一点的想法,这将非常有帮助。如果你能建议我如何使这更好,那就更好了。
存储过程被称为进程日志。它有 DBID、ObjectId、Step、Status、Remarks、Reads、Inserts、Updates、Delete 等参数
我们要做的是,在每个存储过程中,我们必须执行这个存储过程,状态为 2(进行中)在增加值后,在每个步骤或部分结束时可以多次执行这个存储过程的过程的可变步长。根据插入更新选择和删除语句的行数,我们应该在各自的存储过程参数变量中记录值。最后,您可以执行状态为 3(已完成)的相同存储过程,或者如果该过程在 catch 块中结束,状态将为 4(失败)在备注部分,我们可以复制 SQL 的错误消息。
为了查看所有这些信息,我们获得了一份报告的访问权限,显然我没有源代码,但报告显示了存储过程完成的时间,状态是多少插入更新删除和读取它做过。如果失败,错误信息是什么?
我已经有一些改进存储的想法,谁开始的?,参数的值是多少?对于谁开始存储过程部分,我有一个困惑。大多数这些存储过程作为不同作业的一部分运行。我们所有的作业都以服务帐户用户身份运行,但作业由不同的用户手动启动。我需要找出哪个用户启动了它,作为内部存储过程,作为当前用户,它将始终显示服务帐户。同样对于参数值,是否有更好的动态方法来找出这一点?而不是手动设置变量的值。我想使用 INPUTBUFFER 的输出,但它只显示参数的名称而不是值。
如果有人可以指导我有关此审计 SP 的后端表结构和脚本,那将非常有帮助。也欢迎任何更多的改进想法。
我的主要困惑:我相信他们有一些存储这些存储过程值的表,如果 SP 已经在运行,他们会在记录中进行更新,然后进行插入,但是他们如何识别在场景中进行插入而不是更新其中存储过程严重失败并且未执行 catch 块。
audit stored-procedures architecture sql-server-2014 logging
在我们的应用程序中,我们偶尔会遇到由执行sp_tables语句引起的锁定问题。
我们使用 SQL Server 2012。在我们的代码和存储过程中的查询中,我们不使用sp_tables.
我如何才能追踪谁是这次通话的责任人?至少我如何在发生此调用时登录?
我读到它也被第三方调用,在这种情况下,我如何跟踪谁负责?
编辑:
在我们的应用程序中,我们使用 Hibernate 作为 ORM,使用 c3p0 作为连接池。
编辑 2: 我们没有成功理解 sp_tables 的调用时间和调用者,但今天我们成功复制了这个问题。
似乎调用 sp_tables 以响应尝试对架构进行的失败删除。
删除失败,因为还有其他行引用了我们尝试删除的行,因此我们收到异常
SQLServerException: The DELETE statement conflicted with the REFERENCE constraint..
是否有证据表明此类错误会触发数据库上的 sp_tables?
即使写标题,我也对我尝试过的想法感到畏缩(但是,嘿,我在这个过程中学到了一些东西)。
我遇到了一个问题,开发人员在数据库上运行迁移脚本并在此过程中覆盖数据库中已经存在的存储过程(DEV,感谢上帝)。
但是,无法找出谁进行了这些更改,因为:
所以,我尝试在 sys.objects 上写一个触发器,但没有奏效(我不知道为什么我曾经期望它),因为我收到了一个错误:
对象“DEV_DB.sys.objects”不存在或对于此操作无效。
我还尝试为每个开发人员创建一个用户,这样当他们进行自动迁移时,他们将使用我创建的用户,希望sys.objects该开发人员所做的所有更改都将作为他们登录的用户记录。
但是,这并不能工作,因为principal_id还没有填充(我所做的一切就是为每一个开发者&DB新的登录/用户,并赋予登录特定服务器角色:public,db_datawriter,db_datareader,db_ddladmin)。
关于我还可以尝试什么作为替代方案的任何建议?
audit ×10
sql-server ×4
trigger ×2
architecture ×1
blocking ×1
logging ×1
metadata ×1
mysql ×1
oracle ×1
oracle-9i ×1
postgresql ×1
scripting ×1
security ×1
update ×1