【问题标题】:Trigger that intercept sql command from the user [duplicate]触发拦截来自用户的sql命令[重复]
【发布时间】:2017-10-30 12:40:12
【问题描述】:

当触发插入/更新命令时,如何创建一个触发器来拦截 sql 用户在目标表(而不是整个数据库)中执行的命令。示例

当用户对目标表进行更新时,触发器会拦截它并在 custom_log_table 中插入一条记录 插入到目标表中也是如此......触发器也会拦截此命令并保存到 custom_log_table 中

custom_log_table 应包含以下字段:timestamp、sql_user、ipAddress、sql_command。

这个触发器的目的是检测谁在弄乱我们的记录。

多谢了

【问题讨论】:

    标签: sql-server logging triggers insert


    【解决方案1】:

    可以使用 next 保存 SQL 命令:

    declare @tmp table (EventType nvarchar(30), Parameters int, EventInfo nvarchar(4000))
    insert into @tmp exec('DBCC INPUTBUFFER(@@SPID) WITH NO_INFOMSGS')
    

    之后您可以使用@tmp.EventInfo。有关用户信息,请查看SYSTEM_USER 变量或相关函数。

    【讨论】:

    • 这样的?更新后在 MULTA 上创建触发器 LogComando 插入 LOG_COMANDO 值 (GETDATE(),SYSTEM_USER,@tmp.EventInfo,exec('DBCC INPUTBUFFER(@@SPID) WITH NO_INFOMSGS'))
    • 不,你必须首先像我写的那样执行这两行。您不能直接插入存储过程(如 dbcc 任何东西)结果,您必须使用临时表。
    • 我如何从@tmp 获取命令并保存到 log_comando 表中?
    • insert into mytable (myfield, ...) values (@tmp.EventInfo, ...)
    • @Arvo 如果我使用存储过程进行插入/更新,DBCC INPUTBUFFER 将返回什么?
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多