我正在研究数据库审计解决方案,并且正在考虑让SQL Server触发器处理更改并将它们插入到审计表中。由于这是一个SQL Azure数据库并且相当大,我担心由于审计而不断增长的数据库的成本。
为了减少审计所需的成本,我正在考虑将审计表(或表)存储在Azure表而不是Azure SQL数据库中。那么问题就变成了,如何获取SQL Server触发器以将更改的数据导入Azure表?
我唯一能想到的就是在SQL数据库中有一个审计表(或多个表),因此触发器可以在本地插入行,然后每隔X秒就有一个工作者角色从中拉出任何行并移动它们到Azure表并从SQL数据库表中删除,因此它不会变大。
有没有更好的方法来进行此集成?我可以以某种方式将消息从触发器放入队列吗?
答案 0 :(得分:2)
Azure SQL数据库(以前称为SQL Azure)不支持CLR(因此没有EXTERNAL NAME
触发器参数),因此您的触发器无法在T-SQL之外执行任何操作。如果您希望审计内容转到表中,您可以采用您提出的方法(临时写入SQL表,然后定期将内容移动到表)。您可以采取其他方法(这将是意见/主观,在这里不赞成),但是随着队列概念一分钟,因为您询问了队列,并说明了您可以使用Azure队列做什么:
您可以使用Azure队列指定要在SQL数据库中插入/更新的项目。然后,队列处理代码可以负责执行更新并写入Azure表。由于必须在处理后显式删除队列消息,因此如果在执行期间出现故障(例如,您在写入SQL但在写入表存储之前失败),则可以简单地重复队列消息处理。如果在超时值之前没有删除它,则最终会再次显示该消息。只要你的操作是幂等的,你就可以使用这种模式了。
答案 1 :(得分:1)
比使用辅助角色更便宜的解决方案是使用Azure计划任务的组合(您可以在Mobile Apps内每15分钟免费启用它们)和Azure Web Sites。基本上它的工作方式是每15分钟运行一次这个预定的作业,这将调用您在Azure网站中运行的某些代码。此代码将执行您为工作者角色概述的相同工作。
答案 2 :(得分:0)
或者,使用SQL Server System-Versioned时态表自动处理将审计记录(即更改)写入相应历史记录表。