从一个简单的约束看规范性的SQL脚本对数据库运维的影响

简介: 原文:从一个简单的约束看规范性的SQL脚本对数据库运维的影响  之前提到了约束的一些特点,看起来也没什么大不了的问题,http://www.cnblogs.com/wy123/p/7350265.html以下以实际生产运维中遇到的一个问题来说明规范的重要性。
原文: 从一个简单的约束看规范性的SQL脚本对数据库运维的影响

 

之前提到了约束的一些特点,看起来也没什么大不了的问题,http://www.cnblogs.com/wy123/p/7350265.html
以下以实际生产运维中遇到的一个问题来说明规范的重要性。


如下是一个简单的建表脚本,表面上看起来并没有什么问题。
其中创建了3个约束,一个主键约束,一个唯一约束,一个默认值约束,该脚本执行起来没有任何问题。

USE Test
GO

if exists(select 1 from sys.tables where name = 'TestConstraint')
    drop table dbo.TestConstraint
GO

create table dbo.TestConstraint
(
    id int primary key,
    name varchar(100) unique,
    createdate date default getdate()
)
GO

 

如下是上述建表脚本执行之后生成的约束信息,可以看到生成的约束都是按照一定规则+随机字符生成的约束名字。
实话说这不是我们想要的命名方式,之前提到过,我们不愿意看到数据库中存在非预期或者说是随机的命名信息.
当然不仅仅是强迫症的原因,非要看到一个规范的命名。

随着需求的变更,需要修改一个字段的类型,当执行修改字段类型的脚本的时候,发现报错了,原因是字段上有一个约束,如果想要修改字段类型,就要先删除这个约束。

   

既然无法直接修改字段类型,那么就删除该约束,再重定义字段类型,也是没有问题的。

  

  但是问题就出在这里,变更脚本的执行肯定是从开发环境开始修改,然后测试,然后再上测试环境,测试通过,最后才上生产环境执行。
  这里没办法保证,在开发环境写完的脚本,可以直接在测试环境执行,可以在生产环境执行。
  整个流程基本上是自动化执行的,脚本也是通用性执行的,如果中间改来改去,是不是要浪费很多无所谓的时间。
  难不成开发环境写一个,测试环境写一个,生产环境写一个?并且需要一个一个用SSMS打开或者通过系统表来查看具体环境中字段上约束的名称?
  某些情况下,对于某些敏感的生产数据库,不是轻易就可以访问的。
  当然有人说老子可以随时连上生产库,随时可以通过SSMS图形界面进行操作,这种情况例外不讨论。
    此种情况显然是不太符合规范的,并且是增加了无所谓的工作量,我想有价值的工作绝不是做这些毫无意义的重复性劳动吧。

 

 

要想规避此类情况,就要从建表开始,建表的过程中就执行规范的名字,然后这个建表脚本不管在哪个环境,生成的约束都是指定的名字。
在上述修改字段类型的情况下,写的脚本就可以通用在各个环境中了。

USE Test
GO

if exists(select 1 from sys.tables where name = 'TestConstraint')
    drop table dbo.TestConstraint
GO
--不要在建表的时候指定约束,这样会生成随机的约束名字
create table dbo.TestConstraint
(
    id int not null,
    name varchar(100) ,
    createdate date 
)
GO

--主键约束
alter table dbo.TestConstraint
    add constraint [PK_TestConstraint] primary key  clustered (id)  
GO

--唯一约束
alter table dbo.TestConstraint
    add constraint [UQ_TestConstraint_name] unique(name)  
GO

--默认值约束
alter table dbo.TestConstraint
add constraint [DF_TestConstraint_createdate] DEFAULT GETDATE() FOR createdate
GO

当然在修改字段类型的脚本为了严谨期间,也要做到可以重复执行,以下仅为示例,总之就是要尽可能规范性和严谨性,以减少无所谓的麻烦。

if exists(select 1 from sys.default_constraints where name = 'DF_TestConstraint_createdate')
begin
    alter table dbo.TestConstraint
    drop constraint DF_TestConstraint_createdate
end
go

alter table TestConstraint
alter column createdate datetime
GO

alter table dbo.TestConstraint
add constraint DF_TestConstraint_createdate DEFAULT GETDATE() FOR createdate
GO

 

数据库从安装,到对外开发使用,到后期的运维,甚至到退役,有一系列的规范性操作。
本文仅从建表时候约束这个个非常小的方面,来说明规范性对开发以及运维工作的影响。
一屋不扫可以扫天下,规范无小事,数据库也不例外,
说到规范,很多人不屑,认为可有可无,比如说破嘴皮子的三范式,
有人拿着“适度冗余”来逃避三范式,觉得“适度冗余”是一个时髦+时尚+牛逼+鄙视呆板的一种设计,
对于关系数据库,违反三范式的“适度冗余”一旦考虑的不够周全,遇到数据的不一致性,就算你死了,你自己去修复数据吧。

以上“改字段”一句话看起来简单,遇到这种事,背后一系列操蛋性的操作,如果经常有类似的问题,工作的价值又在哪里呢?
从最基本的规范就可以看出来一个团队的工作风格和技术能力。

 

 

目录
相关文章
|
4天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
40 10
|
21天前
|
SQL 存储 BI
【软件设计师备考 专题 】数据库语言(SQL)
【软件设计师备考 专题 】数据库语言(SQL)
88 0
|
25天前
|
SQL 数据库
sql server中创建数据库和表的语法
sql server中创建数据库和表的语法
17 1
|
4天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
49 6
|
1天前
|
SQL 关系型数据库 MySQL
【后端面经】【数据库与MySQL】为什么MySQL用B+树而不用B树?SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
10 3
|
4天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
19 0
|
4天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
12天前
|
数据库 SQL 索引
什么是数据库 SQL Execution Plan
什么是数据库 SQL Execution Plan
10 0
|
19天前
|
运维 监控 Linux
linux脚本自动化运维任务
Linux自动化运维通过脚本提升效率,涵盖服务管理(启停服务、异常恢复)、系统监控(资源警报)、日志管理(清理分析)、备份恢复、补丁更新、自动化部署(如Ansible)、网络管理、定时任务(cron)和故障排查。结合shell、Python及工具,形成高效运维体系。
18 3
|
25天前
|
SQL 数据可视化 Apache
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
阿里云数据库 SelectDB 内核 Doris 的 SQL 方言转换工具, Doris SQL Convertor 致力于提供高效、稳定的 SQL 迁移解决方案,满足用户多样化的业务需求。兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移。
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移