You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何监控Azure SQL Server中存储过程或视图的变更?

实现Azure SQL存储过程/视图修改告警的方案

方法一:DDL触发器+Azure Monitor告警

1. 创建事件捕获机制

先在目标数据库创建日志表和DDL触发器,捕获存储过程、视图的创建/修改/删除操作:

-- 创建操作日志表
CREATE TABLE DDLChangeLog (
    LogID INT IDENTITY(1,1) PRIMARY KEY,
    EventType NVARCHAR(100),
    ObjectName NVARCHAR(256),
    ObjectType NVARCHAR(100),
    LoginName NVARCHAR(256),
    ChangeTime DATETIME DEFAULT GETDATE()
);
GO

-- 创建DDL触发器,指定需要监控的事件
CREATE TRIGGER TrackProcViewChanges
ON DATABASE
FOR ALTER_PROCEDURE, CREATE_PROCEDURE, DROP_PROCEDURE,
    ALTER_VIEW, CREATE_VIEW, DROP_VIEW
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO DDLChangeLog (EventType, ObjectName, ObjectType, LoginName)
    SELECT
        EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'),
        EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(256)'),
        EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]', 'NVARCHAR(100)'),
        EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]', 'NVARCHAR(256)');
END;
GO

2. 配置Azure Monitor告警

  • 登录Azure门户,找到目标Azure SQL数据库,进入监视 > 日志
  • 编写Kusto查询筛选新增的操作记录:
    DDLChangeLog
    | where ChangeTime > ago(5m)
    
  • 基于该查询创建告警规则:设置触发条件(如每次有新记录即触发),选择通知方式(邮件、短信、Teams通知等),添加接收人或群组

方法二:DDL触发器+数据库邮件直接通知

如果不想依赖Azure Monitor,可直接通过数据库邮件发送告警:

1. 配置数据库邮件

-- 启用数据库邮件功能
sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Database Mail XPs', 1;
RECONFIGURE;
GO

-- 创建邮件账户(替换为你的SMTP信息)
EXEC msdb.dbo.sysmail_add_account_sp
    @account_name = 'AzureSQLAlertAccount',
    @email_address = '你的告警邮箱@domain.com',
    @display_name = 'Azure SQL DDL告警',
    @mailserver_name = 'smtp.domain.com',
    @port = 587,
    @username = 'SMTP用户名@domain.com',
    @password = 'SMTP密码';

-- 创建邮件配置文件
EXEC msdb.dbo.sysmail_add_profile_sp
    @profile_name = 'SQLAlertProfile';

EXEC msdb.dbo.sysmail_add_profileaccount_sp
    @profile_name = 'SQLAlertProfile',
    @account_name = 'AzureSQLAlertAccount',
    @sequence_number = 1;

2. 修改触发器添加邮件发送逻辑

ALTER TRIGGER TrackProcViewChanges
ON DATABASE
FOR ALTER_PROCEDURE, CREATE_PROCEDURE, DROP_PROCEDURE,
    ALTER_VIEW, CREATE_VIEW, DROP_VIEW
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @EventType NVARCHAR(100), @ObjectName NVARCHAR(256), 
            @ObjectType NVARCHAR(100), @LoginName NVARCHAR(256),
            @EmailBody NVARCHAR(MAX);

    SELECT
        @EventType = EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'),
        @ObjectName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(256)'),
        @ObjectType = EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]', 'NVARCHAR(100)'),
        @LoginName = EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]', 'NVARCHAR(256)');

    INSERT INTO DDLChangeLog (EventType, ObjectName, ObjectType, LoginName)
    VALUES (@EventType, @ObjectName, @ObjectType, @LoginName);

    -- 构造告警邮件内容
    SET @EmailBody = 
        'Azure SQL数据库发生DDL操作:' + CHAR(13) + CHAR(10) +
        '操作类型:' + @EventType + CHAR(13) + CHAR(10) +
        '对象名称:' + @ObjectName + CHAR(13) + CHAR(10) +
        '对象类型:' + @ObjectType + CHAR(13) + CHAR(10) +
        '操作用户:' + @LoginName + CHAR(13) + CHAR(10) +
        '操作时间:' + CONVERT(NVARCHAR, GETDATE(), 120);

    -- 发送告警邮件
    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'SQLAlertProfile',
        @recipients = '告警接收邮箱@domain.com',
        @subject = 'Azure SQL存储过程/视图修改告警',
        @body = @EmailBody;
END;
GO

注意事项

  • 使用数据库邮件时,需确保Azure SQL服务器允许出站SMTP连接,或使用Azure官方邮件服务
  • DDL触发器会捕获所有符合条件的操作(包括自动化脚本执行的修改),可根据需求调整监控的事件类型
  • 定期清理DDLChangeLog表,避免日志数据过多占用存储空间

内容的提问来源于stack exchange,提问作者user3538228

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:30:04