小编WAF*_*WAF的帖子

如何检测对数据库的任何更改(DDL 和 DML)

我客户的 SQL 服务器上有很多数据库。这些数据库正在开发中,因此开发人员可以进行设计、重构、数据修改等。有一些数据库很少更改。我的客户必须确保所有这些都安全(备份)并花一些时间管理环境。(公司没有DB管理员职位。)经过长时间的讨论,客户决定使用每日完整备份策略,因为恢复容易。

所以这里是情况的总结:

  • 数据库的数量每天都在变化。
  • 应备份已更改的数据库(意味着数据和/或结构已更改)。
  • 未更改的数据库不得备份。
  • 解决方案不应影响数据库结构(不受限制的要求)
  • 这个“备份引擎”应自动工作。

主要问题:如何检测数据库已更改。问题的第一部分(DDL 更改)可以通过使用DDL 触发器来解决。但是数据更改(DML 更改)是一个问题。不可能将 DML 触发器应用于所有数据库的所有表以跟踪更改(性能、扩展对象的管理......)。备份引擎必须跟踪所有更改以将每个数据库标记为准备备份。

  • Change Data Capture是一个解决方案,但它似乎太重了(它还需要 SQL Server 企业版)。

  • 另一种方法是跟踪数据库文件更改(大小或上次更改时间),但它无法正常工作:当数据库超过所有保留的可用空间时,它可以更改其大小,而sp_spaceused不是解决方案。

  • 跟踪是一种解决方案,但它会导致性能问题并需要额外的管理。

是否有任何解决方案可以在不影响其他数据库管理对象(如统计信息..)的情况下计算实际数据库使用大小?当然,对不改变表大小的表数据的更改不会触发(我认为),但总比没有好。我真的在寻找 SQL Server 2008 的直接或间接解决方案。

感谢您的任何评论、解决方案和想法。

添加:

这是解决方案(感谢玛丽安):

Select
    NextLSN = MAX(fn.[Current LSN])
    ,Databasename = DB_NAME()
 from fn_dblog(NULL,    NULL) fn
     LEFT JOIN sys.allocation_units au
         ON fn.AllocUnitId = au.allocation_unit_id
     LEFT  JOIN sys.partitions p
         ON p.partition_id = au.container_id
     LEFT  JOIN sys.objects so
         ON so.object_id = p.object_id  
    WHERE 
    (
        (Operation …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server-2008 backup

15
推荐指数
1
解决办法
5万
查看次数

MySQL 在数字列中加载 NULL

MySQL 5.6.23,InnoDB

我正在使用LOAD DATA INFILEcommnd从字符分隔的文本文件中加载表格,我希望每个带有 a 的字段(此设置中\NNULL字符)将 aNULL放在表格中。某些数字类型具有此行为,而其他数字类型将0. 我正在使用FIELDS TERMINATED BY并且某些列确实可以正确获取NULL值,因此它不是固定行格式问题。

这些是我在测试时观察到的类型:

  • INT插入NULL小号
  • DECIMAL(x,0)插入NULL小号
  • DECIMAL(x,y)插入0.0小号
  • FLOAT插入0小号
  • DOUBLE(x,y)插入0.0小号
  • DOUBLE插入0小号

所有有问题的列都用DEFAULT NULL. 我知道各种函数可以将这些0s 转换为NULLs。问题是是否有一种数据类型可以处理十进制精度并且还会NULL在加载时插入s。

此外,我看到了一大堆与对字符串、空字符串和空值之间的区别的误解有关的问题。(示例 示例 示例)这不是问题,因为NULL当我将其重新定义为 DECIMAL(x,0) 时,s 就在那里并且正确加载到同一列中,然后在定义为 DECIMAL(x,3) 时不正确。

mysql null datatypes mysql-5.6

8
推荐指数
1
解决办法
1万
查看次数

标签 统计

backup ×1

datatypes ×1

mysql ×1

mysql-5.6 ×1

null ×1

sql-server-2008 ×1

trigger ×1