AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 17357
Accepted
Scott Chamberlain
Scott Chamberlain
Asked: 2012-05-03 07:00:47 +0800 CST2012-05-03 07:00:47 +0800 CST 2012-05-03 07:00:47 +0800 CST

是否可以执行 ALL SERVER DML Trigger?

  • 772

当客户从另一家公司切换到我们时,我的部门致力于转换客户的数据库。我们有一个 RDP 会话,他们可以连接并查看我们的软件及其数据。一旦他们批准转换,我们就会从我们的服务器复制数据并在现场为他们进行设置。

AFTER在转换批准阶段,如果我们可以在连接到服务器的所有数据库上运行一些和触发器,这将使我们的事情变得简单得多INSTEAD OF(我们的部门与开发软件的部门不同,他们不会制作版本对于为我们内置的东西的测试站点)。

我看到两个选项:

  1. 创建一个 DML 触发器,该触发器在连接到服务器的所有数据库上执行操作,但是当数据库移动到实时服务器时,该操作不再发生,因为它是在服务器而不是数据库上运行的。
  2. 有一个 DML 触发器,如果​​它检测到它不再连接到测试服务器并且处于实时环境中,它会自行删除。

从我阅读的内容来看,我认为第一个选项是不可能的,但我想检查一下。我想我足够了解第二个选项,但是任何如何实现它的例子都会非常有帮助。

sql-server sql-server-2005
  • 2 2 个回答
  • 1588 Views

2 个回答

  • Voted
  1. Best Answer
    datagod
    2012-05-03T07:11:33+08:002012-05-03T07:11:33+08:00

    您将无法创建服务器范围的触发器,因为它必须存在于发生 DML 更改的同一数据库中。

    拥有自删除代码听起来也有点问题。

    我认为您将必须制定一个流程,在附加新数据库时创建触发器,并在完成它们时删除它们。这很可能是一个手动过程。

    • 2
  2. Ivan Stankovic
    2013-11-30T02:00:11+08:002013-11-30T02:00:11+08:00

    在以下示例中,使用 SQL Server 的 EVENTDATA() 函数捕获有关触发触发器的事件的信息。SQL 脚本创建 DDL 触发器,该触发器在数据库级别捕获 CREATE、ALTER 和 DROP 事件(尽管可以在服务器级别创建触发器以捕获服务器上所有数据库的事件;应该使用 ON ALL SERVER 选项,而不是在数据库上):

    CREATE TRIGGER Audit_DDL
    ON DATABASE
        FOR CREATE_TABLE, ALTER_TABLE, DROP_TABLE
    AS
         DECLARE
            @event xml;
         SET
         @event = EVENTDATA();
         INSERT INTO Audit_DDL_Events
         VALUES
         (
         REPLACE(CONVERT(varchar(50),
         @event.query('data(/EVENT_INSTANCE/PostTime)')), 'T', ' ')
         ,
         CONVERT(varchar(150),
         @event.query('data(/EVENT_INSTANCE/LoginName)'))
         ,
         CONVERT(varchar(150),
         @event.query('data(/EVENT_INSTANCE/UserName)'))
         ,
         CONVERT(varchar(150),
         @event.query('data(/EVENT_INSTANCE/DatabaseName)'))
         ,
         CONVERT(varchar(150),
         @event.query('data(/EVENT_INSTANCE/SchemaName)'))
         ,
         CONVERT(varchar(150),
         @event.query('data(/EVENT_INSTANCE/ObjectName)'))
         ,
         CONVERT(varchar(150),
         @event.query('data(/EVENT_INSTANCE/ObjectType)'))
         ,
         CONVERT(varchar(max),
         @event.query('data(/EVENT_INSTANCE/TSQLCommand/CommandText)'))
         );
    

    还必须为来自 EVENTDATA XML 的审计数据创建一个适当的存储表:

    CREATE TABLE Audit_DDL_Events
    (
                 DDL_Event_Time            datetime
                 ,
                 DDL_Login_Name            varchar(150)
                 ,
                 DDL_User_Name             varchar(150)
                 ,
                 DDL_Database_Name         varchar(150)
                 ,
                 DDL_Schema_Name           varchar(150)
                 ,
                 DDL_Object_Name           varchar(150)
                 ,
                 DDL_Object_Type           varchar(150)
                 ,
                 DDL_Command              varchar(max)
    );
    

    现在,我们已经为跟踪 DDL 更改做好了准备,创建、修改或删除通过触发器捕获的表时的信息如下所示:

    在此处输入图像描述

    尽管我们已经证明这种方法可以产生可行的审计结果,但使用触发器跟踪 SQL Server 中的 DDL 更改有几个缺点。首先,具有足够权限的用户可以轻松禁用触发器。另一种避免通过触发器跟踪 SQL Server 中的 DDL 更改的方法是执行架构更改,然后从审核存储库中删除捕获的信息。在我们的例子中,只需从 Audit_DDL_Events 表中删除适当的条目即可。此外,如果不存在可以恶意执行 DDL 更改的特权用户,则此方法无法提供有关在设置之前发生的更改的信息

    您可以在跟踪 SQL Server 中的 DDL 更改 – 'Trouble with Triggers'在线文章中阅读有关该主题的更多信息

    免责声明:我在 ApexSQL 担任产品支持工程师

    • 1

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve