0

有没有办法从触发器中访问触发触发器的 sql?我已经设法通过加入 master..monProcessSQLText MDA 表来获得它,但这仅适用于具有 mon_role 的用户,我不想将其提供给所有人。我错过了一个全局变量吗?

我正在尝试记录针对表运行的所有更新,以便可以将其追溯到 IP 地址和用户名。

这是 ASE 12.5。

4

1 回答 1

1

如果你想

记录针对表运行的所有更新,以便我可以将其追溯到 IP 地址和用户名

触发器绝对是错误的方法,触发器不是为此而设计的,还有其他 ASE 工具是为此而设计的。这不是关于桌子,而是关于一般的安全和监控。

  1. Sybase 审计。
    它需要一些设置,比 MAD 表的开销要少得多;但最重要的是,它是为审计而设计的(MDA 不是)。并且没有像MDA这样的编码要求。它是高度可配置的,其想法是只捕获您需要的东西,而不是更多。

  2. 监测。
    我不会推荐 MDA 表,但是既然你已经准备好了它们,并且你已经启用了监控,并接受了 22% 的捕获 SQL 文本的开销......信息非常短暂。为了将它们用于任何相关目的,例如您的目的,您需要编写一个捕获和存储机制,将所有需要的信息归档到归档数据库中。这必须持续进行,并且完全独立于触发器等。您还可以动态过滤以减少存储的数据量(警告,它是巨大的)。清除超过 7 天的数据等。这本身就是一个小项目,这就是为什么有来自 3rd 方的商业可用。

一旦这些设施中的任何一个到位,然后,无论何时,当您想询问谁更新了表格、何时以及从何处更新表格时,您需要做的就是检查档案。与触发器无关,或难以从触发器获取信息,或为普通用户授予管理员权限。

此外,需要注意的是,您没有正常的安全措施,表格是由用户直接更新的;因此,直接更新权限已授予特定用户,或者更糟的是,所有用户。结果是,无法知道谁在更新表,谁在破坏数据或参照完整性。

  • 安全的方法是将整个事务放在一个存储过程中,从而消除不完整事务的可能性(以及提高执行速度);并授予对过程而不是表的权限,从而消除直接更新。随着时间的推移,你可能希望在服务器中实现安全,这样后果就不必被一个一个地追查和关闭,一个没有终点的过程。

就审计而言,如果安全到位,那么审计负担也会大大减少:您只需要审计存储过程的执行。否则,您需要审核所有表的所有更新。

于 2010-10-24T00:07:14.600 回答