• [技术干货] sqlserver CTE删除重复数据的实现方法 --转载
    sqlserver CTE删除重复数据实现删除重复数据,并保留一条使用 ROW_NUMBER() 窗口函数为每一行分配一个行号,按重复列的条件分组;使用 CTE 来表示重复的行;删除行号大于1的行。123456789101112WITH CTE AS (SELECTIOT_TerminalNo,SendDate,EVoltage,ECurrent,CreateTime,ROW_NUMBER() OVER ( PARTITION BY IOT_TerminalNo, SendDate ORDER BY (SELECT 0) ) AS rnFROMEquipment_1001where--IOT_TerminalNo='Weldjoin-000001' ANDSendDate >='2025-04-01 00:00:00.000'AND SendDate<'2025-07-07 13:26:32.830')DELETE FROM CTE WHERE rn > 1;PARTITION BY:按条件分组;rn > 1:删除所有重复的行,只保留每组中的第一行;SQL server 删除完全重复的数据并保留一条前提SQL server 数据库,某张表有主键,且存在多条完全重复的数据,并且重复数据的ID也完全相同,在删除其中一条后,所有的重复数据全都被删除了。实现删除重复数据,并保留一条使用 ROW_NUMBER() 窗口函数为每一行分配一个行号,按重复列的条件分组;使用 CTE 来表示重复的行;删除行号大于1的行。12345678910WITH CTE AS (    SELECT        ## 字段        code,        timePoint,        ROW_NUMBER() OVER ( PARTITION BY code, TimePoint ORDER BY (SELECT 0) ) AS rn    FROM        table_name)DELETE FROM CTE WHERE rn > 1;解释PARTITION BY:按条件分组;rn > 1:删除所有重复的行,只保留每组中的第一行;
  • [技术干货] SQL Server脏读防御指南 --转载
    一、第一步:环境搭建——给数据库装上"零食监控器"目标:创建测试表,像准备零食一样准备好数据。步骤:创建测试表:12345678910-- 创建模拟数据表(假设是"零食库存表")  CREATE TABLE Snacks  (      Id INT PRIMARY KEY,      Name NVARCHAR(50),      Stock INT );   -- 插入初始数据(袋装薯片库存50)  INSERT INTO Snacks VALUES (1, '薯片', 50);  开启两个会话:在SQL Server Management Studio(SSMS)中打开两个查询窗口,分别模拟事务A和事务B。注释解析:Stock字段模拟库存数量,初始值为50。两个会话分别代表两个"偷吃零食"的事务。二、第二步:复现脏读——让数据上演"偷吃现场"目标:用两个事务模拟脏读,像偷吃薯片后被发现一样。场景:事务A:假装"偷吃"薯片,但还没提交。事务B:假装"检查库存",发现被偷吃的数据。代码示例(事务A窗口):1234567891011-- 事务A:偷吃20袋薯片(但不提交!)  BEGIN TRANSACTION;   UPDATE Snacks  SET Stock = Stock - 20  WHERE Id = 1;   -- 暂停在此,等待事务B执行  WAITFOR DELAY '00:00:10'; -- 等待10秒让事务B有时间执行   ROLLBACK; -- 最终放弃偷吃(模拟回滚)  代码示例(事务B窗口):1234-- 事务B:查看库存(可能会读到脏数据)  SELECT * FROM Snacks WHERE Id = 1;   -- 预期结果:Stock = 30(但事务A未提交!)  现象:事务B会读到Stock=30,但事务A最终回滚,实际库存仍是50。这就是脏读!就像偷吃薯片后又假装没动,但被监控拍到!三、第三步:解决方案1——用Read Committed隔离级别"锁住零食袋"目标:设置事务隔离级别,像给零食袋上锁一样防止未提交数据被读取。步骤:在事务B中设置隔离级别:12345678-- 在事务B窗口中,修改查询为:  SET TRANSACTION ISOLATION LEVEL READ COMMITTED;  BEGIN TRANSACTION;   SELECT * FROM Snacks WHERE Id = 1;   -- 结果:Stock始终显示50(脏读被阻止!)  COMMIT;  注释解析:READ COMMITTED:确保只能读取已提交的数据,像给零食袋加了"已开封需付款"的标签。事务B现在会等待事务A提交或回滚,不会读取中间状态。四、第四步:解决方案2——用锁机制"贴上封条"目标:用显式锁强制阻止脏读,像给零食袋贴上"勿动"封条。步骤:在事务A中使用排他锁:123456789101112-- 事务A:偷吃时立即加锁  BEGIN TRANSACTION;   UPDATE Snacks  SET Stock = Stock - 20  WHERE Id = 1  WITH (ROWLOCK, XLOCK); -- 行级排他锁   -- 等待期间,事务B无法读取此行!  WAITFOR DELAY '00:00:10';   ROLLBACK;  事务B尝试读取:12-- 事务B:现在会阻塞,直到事务A释放锁  SELECT * FROM Snacks WHERE Id = 1;  注释解析:XLOCK:强制对行加排他锁,其他事务无法读取或修改。这就像给零食袋贴上"正在偷吃,请勿打扰"的封条!五、第五步:解决方案3——用乐观锁"防闺蜜偷吃"目标:用版本控制机制,像零食包装上的防伪码一样检测数据变化。步骤:修改表结构,添加版本字段:12ALTER TABLE Snacks  ADD Version INT DEFAULT 0; -- 版本号初始为0  事务A尝试偷吃并更新版本号:123456789101112BEGIN TRANSACTION;   -- 读取当前版本  DECLARE @CurrentVersion INT;  SELECT @CurrentVersion = Version FROM Snacks WHERE Id = 1;   UPDATE Snacks  SET Stock = Stock - 20, Version = Version + 1  WHERE Id = 1 AND Version = @CurrentVersion; -- 检查版本是否一致   -- 模拟回滚  ROLLBACK;  事务B检查版本号:123SELECT * FROM Snacks WHERE Id = 1;   -- 结果:版本号未变化,Stock仍为50  注释解析:乐观锁通过版本号比对,确保只有未被修改的数据能被更新。这就像零食包装上的防伪码,一撕就暴露"偷吃痕迹"!六、第六步:终极防御——用快照隔离级别"开监控录像"目标:用快照隔离级别记录数据历史,像监控录像回放一样防偷吃。步骤:在数据库级别启用快照隔离:12-- 在SSMS中右键数据库 → 属性 → 选项 → 启用"允许快照隔离"  ALTER DATABASE YourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON;  事务B使用快照隔离:1234567SET TRANSACTION ISOLATION LEVEL SNAPSHOT;  BEGIN TRANSACTION;   SELECT * FROM Snacks WHERE Id = 1;   -- 即使事务A未提交,结果仍为50!  COMMIT;  注释解析:快照隔离通过记录历史版本,让事务B看到事务A修改前的数据。这就像监控录像回放,永远显示"偷吃前"的库存!七、第七步:实战演练——用代码验证所有方案场景:模拟多个解决方案的实际效果。代码示例(事务A):1234-- 方案1:脏读发生  BEGIN TRANSACTION;  UPDATE Snacks SET Stock = 30 WHERE Id = 1;  -- 不提交,等待事务B读取  代码示例(事务B):123456789-- 方案1:脏读发生  SELECT * FROM Snacks; -- 读到30   -- 方案2:使用Read Committed  SET TRANSACTION ISOLATION LEVEL READ COMMITTED;  SELECT * FROM Snacks; -- 仍读到50!   -- 方案3:使用乐观锁  SELECT * FROM Snacks WHERE Version = 0; -- 确保未被修改 
  • [技术干货] 教你如何识别SQL Server中需要添加索引的查询 --转载
    一、为什么需要索引优化?性能瓶颈:全表扫描(Table Scan)可能导致简单查询耗时数秒资源浪费:未使用索引的查询消耗额外CPU和I/O资源隐性成本:缺失索引可能使关键业务操作延迟数倍据统计,合理添加索引可使查询性能提升10-100倍(来源:Microsoft SQL Server性能调优白皮书) 二、核心诊断查询 1. 缺失索引自动生成脚本123456789101112131415161718192021SELECT TOP 10   ROUND(migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans), 0) AS improvement_measure,   DB_NAME(mid.database_id) AS database_name,   OBJECT_NAME(mid.object_id) AS table_name,   'CREATE INDEX [IX_' + OBJECT_NAME(mid.object_id) + '_'       + REPLACE(REPLACE(REPLACE(ISNULL(mid.equality_columns, ''), ', ', '_'), '[', ''), ']', '')        + CASE WHEN mid.inequality_columns IS NOT NULL THEN '_' + REPLACE(REPLACE(REPLACE(mid.inequality_columns, ', ', '_'), '[', ''), ']', '') ELSE '' END       + '] ON ' + mid.statement        + ' (' + ISNULL(mid.equality_columns, '')       + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END       + ISNULL(mid.inequality_columns, '') + ')'       + ISNULL(' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,   migs.user_seeks AS seek_operations,   migs.avg_user_impact AS improvement_percentFROM sys.dm_db_missing_index_group_stats AS migsINNER JOIN sys.dm_db_missing_index_groups AS mig   ON migs.group_handle = mig.index_group_handleINNER JOIN sys.dm_db_missing_index_details AS mid   ON mig.index_handle = mid.index_handleWHERE mid.database_id = DB_ID()ORDER BY improvement_measure DESC; 结果解读:improvement_measure:综合改进指标(值越大优先级越高)improvement_percent:预估查询性能提升百分比seek_operations:该索引可能被使用的次数 2. 高开销扫描查询定位1234567891011121314SELECT TOP 5   qs.total_logical_reads / qs.execution_count AS avg_logical_reads,   qs.execution_count,   SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,       ((CASE qs.statement_end_offset           WHEN -1 THEN DATALENGTH(st.text)           ELSE qs.statement_end_offset       END - qs.statement_start_offset)/2) + 1) AS query_text,   qp.query_planFROM sys.dm_exec_query_stats AS qsCROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS stCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qpWHERE qp.query_plan.exist('//RelOp[@PhysicalOp="Index Scan" or @PhysicalOp="Clustered Index Scan"]') = 1ORDER BY avg_logical_reads DESC;关键指标:avg_logical_reads > 1000 表示严重I/O问题执行计划中出现 Index Scan 警告 3. 未索引的热点列检测1234567891011121314SELECT TOP 10   t.name AS TableName,   c.name AS ColumnName,   SUM(us.user_scans) AS total_scansFROM sys.tables tJOIN sys.columns c ON t.object_id = c.object_idLEFT JOIN sys.index_columns ic    ON ic.object_id = t.object_id AND ic.column_id = c.column_idLEFT JOIN sys.indexes i ON i.object_id = t.object_id AND i.index_id = ic.index_idLEFT JOIN sys.dm_db_index_usage_stats us ON us.object_id = t.object_id AND us.index_id = i.index_idWHERE i.index_id IS NULL  -- 无索引列   AND us.user_scans > 0GROUP BY t.name, c.nameORDER BY total_scans DESC;  三、索引创建黄金法则 1. 索引设计原则123456789-- 标准结构CREATE INDEX IX_Table_KeyColumnsON dbo.Table (Column1 ASC, Column2 DESC)INCLUDE (Column3, Column4)WITH (FILLFACTOR = 90); -- 针对频繁更新表-- 筛选索引(针对热点数据)CREATE INDEX IX_Orders_ActiveON dbo.Orders (OrderDate)WHERE Status = 'Processing';  2. 四要四不要| 该做的 | 避免的 ||---------------------------|--------------------------|| 优先选择高选择性列 | 在bit类型列建索引 || INCLUDED列放常用查询字段 | 创建重复功能索引 || 定期重建碎片率>30%的索引 | 盲目接受所有系统建议 || 测试环境验证性能提升 | 在生产环境直接创建索引 | 四、高级技巧 1. 索引使用监控123456789101112SELECT   OBJECT_NAME(ix.object_id) AS TableName,   ix.name AS IndexName,   ix.type_desc AS IndexType,   us.user_seeks,   us.user_scans,   us.user_lookups,   us.user_updatesFROM sys.dm_db_index_usage_stats usJOIN sys.indexes ix ON us.object_id = ix.object_id AND us.index_id = ix.index_idWHERE us.database_id = DB_ID()   AND OBJECTPROPERTY(us.object_id, 'IsUserTable') = 1; 决策依据:user_updates > 10 * (user_seeks + user_scans) → 考虑删除索引user_lookups 过高 → 需要优化INCLUDED列 2. 查询存储深度分析(SQL Server 2016+)123456789101112SELECT   q.query_id,   t.query_sql_text,   rs.avg_duration,   rs.avg_logical_io_reads,   p.query_planFROM sys.query_store_query qJOIN sys.query_store_query_text t ON q.query_text_id = t.query_text_idJOIN sys.query_store_plan p ON q.query_id = p.query_idJOIN sys.query_store_runtime_stats rs ON p.plan_id = rs.plan_idWHERE rs.last_execution_time > DATEADD(DAY, -7, GETDATE())ORDER BY rs.avg_logical_io_reads DESC; 五、避坑指南索引覆盖陷阱:包含过多INCLUDED列会显著增大索引体积参数嗅探问题:使用OPTION(RECOMPILE)解决参数敏感查询锁升级风险:单索引超过8KB可能引发锁升级统计信息滞后:开启AUTO_UPDATE_STATISTICS_ASYNC
  • SQL server 三种常用的触发器 ---转载
    SQL server 三种常用的触发器1.触发器的创建创建触发器时可以先判断一下当前数据库里是否已存在相同名字的触发器sql server的触发器名保存在sysobjects这张表里所以要知道是否存在只需创建前查询下该表即可1234567891011121314if not exists(select 1 from sysobjects where name='sqlserver_test(需创建的触发器名称)' and type='tr')(如果当前触发器不存在)begin (则创建触发器) create trigger sqlserver_test(需创建的触发器名) on sqlserver_test_list(当此表发生对应的触发器事件时触发) for update (选择触发器事件) as   if update(recommend) (判断trigger sqlserver_test表的该字段发生了改变)  begin select ‘这是一个触发器的测试' (执行语句基本上是SQL语句都可以写,但是注意触发器有个执行过程如果触发器对应事件会触发频繁建议还是少写为好,以免造成事件进程锁死。跨服务器查询需要服务器打开MDSTC服务)  endendelse此处还是不写为好,总不可能当前触发器存在你写个删除语句吧。。。 2.insert触发器顾名思义在对应表有数据插入时触发123456create trigger sqlserver_test(需创建的触发器名) on sqlserver_test_list(当此表发生对应的触发器事件时触发) for insert (当表有插入时触发) as   select recommend from Inserted (取插入行该字段值)end 3.delete触发器顾名思义在对应表有行数删除时触发123456create trigger sqlserver_test(需创建的触发器名) on sqlserver_test_list(当此表发生对应的触发器事件时触发) for delete (当表有删除时触发) as   select recommend from Deleted (取删除该字段的值)end 4.update触发器顾名思义在对应表有行数更新时触发123456create trigger sqlserver_test(需创建的触发器名) on sqlserver_test_list(当此表发生对应的触发器事件时触发) for update (当表有更新时触发) as   select recommend from Inserted(获取更新后的数据)end 5.关于取值1.插入操作(Insert)Inserted表有数据,Deleted表无数据提示:可以用inserted此表获取需要字段的值去更新其他表数据或者插入至其他表中比较常见的就是作中间表的数据转移2.删除操作(Delete)Inserted表无数据,Deleted表有数据提示:可以用Deleted此表获取需要字段的值去更新其他表数据或者插入至其他表中,比较常见的就是做删除数据记录或备份3.更新操作(Update)Inserted表有数据(新数据),Deleted表有数据(旧数据)提示:可以用Deleted此表获取到修改前表中的数据值,比较常见的就是做数据修改记录或备份。用Inserted获取到修改后的数据值,较常见为获取功能字段供其他表进行相应操作执行。
  • [问题求助] SQL server迁移gaussDB
    请问SQL server迁移GaussDB有什么工具可以实现对象的迁移?
  • [常见问题汇总帖] RPA问题
    RPA访问连接数据库获取数据除了通过连接数据库控件还有其他方法吗
  • [技术干货] arm架构服务器安装SQL SERVER
    实际上arm架构服务器是不可以安装SQL SERVER的,SQL SERVER 2022 preview 版本说明也没有提及兼容arm架构。目前唯一的做法是安装 Azure SQL Edgesudo docker pull mcr.microsoft.com/azure-sql-edgesudo docker run --cap-add SYS_PTRACE -e 'ACCEPT_EULA=1' -e 'MSSQL_SA_PASSWORD=Your@Strong!Password' -e 'MSSQL_PID=Developer' -p 1433:1433 --name azuresqledge -d mcr.microsoft.com/azure-sql-edge
  • [交流吐槽] SQL Server 查询存储,做查询优化的利器
    介绍一个SQL Server 2016后新增的功能:查询存储。查询存储的工作原理类似于飞行数据记录器或者黑匣子,不断地收集与查询和计划相关的编译和运行时信息,包括已执行查询的历史记录,查询运行时执行统计信息,针对执行计划的执行计划等。与查询相关的数据将永久保存在内部表中,并通过一组视图向用户显示。通过这些信息,可以快速查找性能差异,识别由查询计划更改和故障排除引起的性能等等问题。通过以下命令或者SSMS界面进行开启ALTER DATABASE [DatabaseOne] SET QUERY_STORE = ON; 查询存储开启后官方对内部对应的一些表,详细描述如下查看说明当然,这种类似的节点信息收集的东西,其实并不适合查询频率过大的查询,经过非严谨测试,性能损耗大概在5%左右。做过DB性能优化的人应该都知道,以前我们要么通过持续性的日志记录分析,要么通过实时的监控去找到对应的性能瓶颈,包括CPU、内存、IO等,查询存储其实就是在此基础上更进一步,把我们关心的点都存储起来,并且有更详尽信息和标准分析报告,相当省事。具体可以查看官方文档学习学习。
  • [行业资讯] 微软改进Cosmos DB并发布SQL Server 2022预览版
    SQL Server在两年前进行了最后一次重大里程碑更新,即SQL Server 2019更新。SQL Server 2022更新的一大重点是与Microsoft Azure云的更紧密集成。同时,微软正在为Cosmos DB数据库提供一系列增量更新,包括索引指标-帮助优化查询性能,以及新Patch API-支持数据库中优化部分文档更新。Gartner公司分析师Adam Ronthal称:“Cosmos DB仍然是强大的多模型非关系DBMS(数据库管理系统)产品。在提供具有多个非关系API的平台时,微软将Cosmos DB定位为适用于云原生应用程序的灵活、现代的DBMS。”在Ronthal看来,微软对Cosmos DB采取了不同于其一些核心竞争对手的方法,主要体现在他们提供多模型非关系平台,而非多个最适合的工程系统。Ronthal称:“这提供了一种统一的方法,对希望整合其数据管理领域的企业很有吸引力。”SQL Server 2022将推动微软云数据服务Cosmos DB是一种较新的多模型云原生数据库,微软仍致力于推进其更成熟的SQL Server 数据库。Cosmos DB于2017年首次发布,而SQL Server的历史可以追溯到1989年,早于现代云时代。通过SQL Server 2022,微软的目标是将关系数据库平台引入其Azure云生态系统。微软执行副总裁Scott Guthrie在Ignite技术会议上说:“SQL Server 2022是迄今为止支持云功能最多的SQL Server版本。”Guthrie指出,SQL Server 2022增加了新的业务连续性功能,在Azure中具有内置灾难恢复集成。该更新还添加了与数据治理平台Azure Purview的集成。Guthrie补充说,它还包括本地操作SQL Server数据的分析,其中Azure Synapse分析运行在云端。总的来说,Guthrie表示微软正在寻求在其内部部署和云数据服务之间提供双向灵活性。根据微软在SQL Server 2022中所采取的方向,Ronthal表示这有助于将Azure定位为分析和业务连续性的重心,同时为本地和云组件提供整体方法。 Ronthal 称:“微软继续投资于本地组件和云组件之间的更深层次集成,利用它们在两个领域的优势。”
  • [交流吐槽] 特定于 Entity Framework Core SQL Server 提供程序的索引功能
    此页详细介绍了特定于 SQL Server 提供程序的索引配置选项。群集聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。 为表创建适当的聚集索引可以显著提高查询的速度,因为数据已经按最佳顺序进行布局。 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。 有关详细信息,请参阅有关聚集索引和非聚集索引的 SQL Server 文档。默认情况下,表的主键列由聚集索引隐式支持,所有其他索引为非聚集索引。可以按如下所示配置要聚集的索引或键:protected override void OnModelCreating(ModelBuilder modelBuilder){    modelBuilder.Entity<Blog>().HasIndex(b => b.PublishedOn).IsClustered();}填充因子提供索引填充因子选项是为了优化索引数据存储和性能。 有关详细信息,请参阅有关填充因子的 SQL Server 文档。可按如下所示配置索引的填充因子:protected override void OnModelCreating(ModelBuilder modelBuilder){    modelBuilder.Entity<Blog>().HasIndex(b => b.PublishedOn).HasFillFactor(10);}联机创建ONLINE 选项允许在创建索引期间并发用户访问基础表或聚集索引数据以及任何关联的非聚集索引,以便用户可以继续更新和查询基础数据。 当脱机执行数据定义语言 (DDL) 操作(例如,生成或重新生成聚集索引)时,这些操作对基础数据和关联索引持有排他锁。 有关详细信息,请参阅有关 ONLINE 索引选项的 SQL Server 文档。可以使用 ONLINE 选项配置索引,如下所示:protected override void OnModelCreating(ModelBuilder modelBuilder){    modelBuilder.Entity<Blog>().HasIndex(b => b.PublishedOn).IsCreatedOnline();}
  • [整体安全] 【漏洞预警】Oracle MySQL Server输入验证错误漏洞(CVE-2022-21367)
    漏洞描述:甲骨文公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989年正式进入中国市场。2013年,甲骨文已超越 IBM ,成为继 Microsoft 后全球第二大软件公司。Oracle MySQL Server是美国甲骨文(Oracle)公司的一款关系型数据库。Oracle MySQL Server存在输入验证错误漏洞,攻击者可利用该漏洞未经授权更新、插入或删除对MySQL Server可访问数据的访问。漏洞危害:Oracle MySQL 的MySQL Server 产品中的漏洞。受影响的版本包括 5.7.36 及更早版本和 8.0.27 及更早版本。易于利用的漏洞允许高特权攻击者通过多种协议进行网络访问,从而破坏MySQL服务器。成功攻击此漏洞可导致未经授权的能力,导致MySQL服务器挂起或频繁可重复的崩溃,以及未经授权的更新,插入或删除对某些MySQL服务器可访问数据的访问。影响范围:Oracle MySQL Server <=5.7.36Oracle MySQL Server <=8.0.27漏洞等级:  中危修复方案:厂商已发布了漏洞修复程序,请及时关注更新:https://www.oracle.com/security-alerts/cpujan2022.html
  • [技术干货] openGauss数据库开发指导手册(上)
    简介本实验指导书主要目的是为了让读者熟悉并掌握openGauss数据库的基本操作,并通过案例强化学习。内容描述本实验指导书先介绍创建管理用户、表及其它数据库对象等openGauss数据库的基本操作,再从学校数据模型的案例入手,进行模拟演练。前置条件openGauss数据库开发需要掌握openGauss数据库的基本操作和SQL语法,openGauss数据库支持SQL2003标准语法,数据库基本操作参见附录一。实验环境说明组网说明本实验环境为华为云ECS服务器和openGauss数据库。设备介绍为了满足本实验需要,建议实验环境采用以下配置:设备名称、型号与版本的对应关系如下:设备明细表设备名称设备型号软件版本数据库openGaussopenGauss 1.1.0操作系统openEuleropenEuler 20.3LTS实验概览1 数据库开发实验1.1 创建和管理用户、表空间和数据库1.1.1 创建和管理用户1.1.1.1 创建用户通过CREATE USER创建的用户,默认具有LOGIN权限;通过CREATE USER创建用户的同时系统会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA;其他数据库中,则不自动创建同名的SCHEMA;用户可使用CREATE SCHEMA命令,分别在其他数据库中,为该用户创建同名SCHEMA。系统管理员在普通用户同名schema下创建的对象,所有者为schema的同名用户(非系统管理员)。创建用户jim,登录密码为Bigdata@123。postgres=# CREATE USER jim PASSWORD 'Bigdata@123'; CREATE ROLE同样的下面语句也可以创建用户。postgres=# CREATE USER kim IDENTIFIED BY 'Bigdata@123'; CREATE ROLE如果创建有“创建数据库”权限的用户,则需要加CREATEDB关键字。postgres=# CREATE USER dim CREATEDB PASSWORD 'Bigdata@123'; CREATE ROLE1.1.1.2 管理用户将用户jim的登录密码由Bigdata@123修改为Abcd@123。postgres=# ALTER USER jim IDENTIFIED BY 'Abcd@123' REPLACE 'Bigdata@123'; ALTER ROLE为用户jim追加CREATEROLE权限。postgres=# ALTER USER jim CREATEROLE; ALTER ROLE将enable_seqscan的值设置为on,设置成功后,在下一会话中生效。postgres=# ALTER USER jim SET enable_seqscan TO on; ALTER ROLE锁定jim帐户。postgres=# ALTER USER jim ACCOUNT LOCK; ALTER ROLE删除用户。postgres=# DROP USER kim CASCADE; DROP ROLE postgres=# DROP USER jim CASCADE; DROP ROLE postgres=# DROP USER dim CASCADE; DROP ROLE1.1.2 创建和管理表空间1.1.2.1 创建表空间步骤 1 执行如下命令创建用户jack。postgres=# CREATE USER jack IDENTIFIED BY 'Bigdata@123';当结果显示为如下信息,则表示创建成功。CREATE ROLE步骤 2 执行如下命令创建表空间。postgres=# CREATE TABLESPACE fastspace RELATIVE LOCATION 'tablespace/tablespace_1';当结果显示为如下信息,则表示创建成功。CREATE TABLESPACE其中“fastspace”为新创建的表空间,“数据库节点数据目录/pg_location/tablespace/tablespace_1”是用户拥有读写权限的空目录,如 /gaussdb/data/db1/pg_location/tablespace/tablespace_1 。步骤 3 数据库系统管理员执行如下命令将“fastspace”表空间的访问权限赋予数据用户jack。postgres=# GRANT CREATE ON TABLESPACE fastspace TO jack;当结果显示为如下信息,则表示赋予成功。GRANT1.1.2.2 管理表空间1.1.2.2.1 查询表空间方式1:检查pg_tablespace系统表。如下命令可查到系统和用户定义的全部表空间。postgres=# SELECT spcname FROM pg_tablespace; spcname ------------ pg_default pg_global fastspace (3 rows)方式2:使用gsql程序的元命令查询表空间。postgres=# \db List of tablespaces Name | Owner | Location ------------+-------+------------------------- fastspace | omm | tablespace/tablespace_1 pg_default | omm | pg_global | omm | (3 rows)1.1.2.2.2 查询表空间使用率步骤 1 查询表空间的当前使用情况。postgres=# SELECT PG_TABLESPACE_SIZE('fastspace');返回如下信息:pg_tablespace_size -------------------- 4096 (1 row)其中4096表示表空间的大小,单位为字节。步骤 2 计算表空间使用率。表空间使用率=PG_TABLESPACE_SIZE/表空间所在目录的磁盘大小。1.1.2.2.3 修改表空间执行如下命令对表空间fastspace重命名为fspace。postgres=# ALTER TABLESPACE fastspace RENAME TO fspace; ALTER TABLESPACE1.1.2.2.4 删除表空间执行如下命令删除用户jack。postgres=# DROP USER jack CASCADE; DROP ROLE执行如下命令删除表空间fspace。postgres=# DROP TABLESPACE fspace; DROP TABLESPACE说明:用户必须是表空间的owner或者系统管理员才能删除表空间。1.1.3 创建和管理数据库1.1.3.1 创建数据库步骤 1 使用如下命令创建一个新的表空间tpcds_local。postgres=# CREATE TABLESPACE tpcds_local RELATIVE LOCATION 'tablespace/tablespace_2'; CREATE TABLESPACE步骤 2 使用如下命令创建一个新的数据库db_tpcc。postgres=# CREATE DATABASE db_tpcc WITH TABLESPACE = tpcds_local; CREATE DATABASE1.1.3.2 管理数据库1.1.3.2.1 查看数据库使用\l元命令查看数据库系统的数据库列表(l表示list)。postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+-------+-----------+---------+-------+------------------- db_tpcc | omm | SQL_ASCII | C | C | postgres | omm | SQL_ASCII | C | C | template0 | omm | SQL_ASCII | C | C | =c/omm + | | | | | omm=CTc/omm template1 | omm | SQL_ASCII | C | C | =c/omm + | | | | | omm=CTc/omm (4 rows)使用如下命令通过系统表pg_database查询数据库列表。postgres=# SELECT datname FROM pg_database; datname ----------- template1 db_tpcc template0 postgres (4 rows)1.1.3.2.2 修改数据库用户可以使用如下命令修改数据库属性(比如:owner、名称和默认的配置属性)。使用以下命令为数据库设置默认的模式搜索路径。postgres=# ALTER DATABASE db_tpcc SET search_path TO pa_catalog,public; ALTER DATABASE使用如下命令为数据库重新命名。postgres=# ALTER DATABASE db_tpcc RENAME TO human_tpcds; ALTER DATABASE1.1.3.2.3 删除数据库用户可以使用DROP DATABASE命令删除数据库。此命令删除了数据库中的系统目录,并且删除了带有数据的磁盘上的数据库目录。用户必须是数据库的owner或者系统管理员才能删除数据库。当有人连接数据库时,删除操作会失败。删除数据库时请先连接到其他的数据库。使用如下命令删除数据库:postgres=# DROP DATABASE human_tpcds; DROP DATABASE1.2 创建和管理表1.2.1 创建表表是建立在数据库中的,在不同的数据库中可以存放相同的表。甚至可以通过使用模式在同一个数据库中创建相同名称的表。执行如下命令创建表。 postgres=# CREATE TABLE customer_t1 ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6), c_last_name char(8) );当结果显示为如下信息,则表示创建成功。CREATE TABLE其中c_customer_sk 、c_customer_id、c_first_name和c_last_name是表的字段名,integer、char(5)、char(6)和char(8)分别是这四字段名称的类型。1.2.2 向表中插入数据1.2.2.1 向表customer_t1中插入一行数据数据值是按照这些字段在表中出现的顺序列出的,并且用逗号分隔。通常数据值是文本(常量),但也允许使用标量表达式。postgres=# INSERT INTO customer_t1(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace');如果用户已经知道表中字段的顺序,也可无需列出表中的字段。例如以下命令与上面的命令效果相同。postgres=# INSERT INTO customer_t1 VALUES (3769, 'hello', 'Grace');如果用户不知道所有字段的数值,可以忽略其中的一些。没有数值的字段将被填充为字段的缺省值。例如:postgres=# INSERT INTO customer_t1 (c_customer_sk, c_first_name) VALUES (3769, 'Grace'); 或postgres=# INSERT INTO customer_t1 VALUES (3769, 'hello');1.2.2.2 向表中插入多行数据命令如下:postgres=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (6885, 'maps', 'Joes'), (4321, 'tpcds', 'Lily'), (9527, 'world', 'James');如果需要向表中插入多条数据,除此命令外,也可以多次执行插入一行数据命令实现。但是建议使用此命令可以提升效率。1.2.2.3 从指定表插入数据到当前表如果从指定表插入数据到当前表,例如在数据库中创建了一个表customer_t1的备份表customer_t2,现在需要将表customer_t1中的数据插入到表customer_t2中,则可以执行如下命令。postgres=# CREATE TABLE customer_t2 ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6), c_last_name char(8) ); 插入数据:INSERT INTO customer_t2 SELECT * FROM customer_t1;删除备份表:postgres=# DROP TABLE customer_t2 CASCADE; DROP TABLE1.2.3 更新表中数据修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行,所有行或者指定的部分行。还可以独立更新每个字段,而其他字段则不受影响。需要将表customer_t1中c_customer_sk为9527的字段重新定义为9876:postgres=# UPDATE customer_t1 SET c_customer_sk = 9876 WHERE c_customer_sk = 9527; UPDATE 1这里的表名称也可以使用模式名修饰,否则会从默认的模式路径找到这个表。SET后面紧跟字段和新的字段值。新的字段值不仅可以是常量,也可以是变量表达式。比如,把所有c_customer_sk的值增加100:postgres=# UPDATE customer_t1 SET c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421;用户可以在一个UPDATE命令中更新更多的字段,方法是在SET子句中列出更多赋值,比如:postgres=# UPDATE customer_t1 SET c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421;1.2.4 查看数据使用系统表pg_tables查询数据库所有表的信息。postgres=# SELECT * FROM pg_tables;使用gsql的\d+命令查询表的结构。postgres=# \d+ customer_t1;执行如下命令查询表customer_t1的数据量。postgres=# SELECT count(*) FROM customer_t1;执行如下命令只查询字段c_customer_sk的数据。postgres=# SELECT c_customer_sk FROM customer_t1;执行如下命令过滤字段c_customer_sk的重复数据。postgres=# SELECT DISTINCT( c_customer_sk ) FROM customer_t1;执行如下命令查询字段c_customer_sk为3869的所有数据。postgres=# SELECT * FROM customer_t1 WHERE c_customer_sk = 3869;执行如下命令按照字段c_customer_sk进行排序。postgres=# SELECT * FROM customer_t1 ORDER BY c_customer_sk;执行如下命令查询ROWNUM伪列。postgres=# SELECT rownum,c_customer_sk,c_customer_id FROM customer_t1;执行如下命令使用别名进行查询(CNB、CSK、CID为列别名,T 为表别名)。postgres=# SELECT rownum CNB,T.c_customer_sk CSK,T.c_customer_id CID FROM customer_t1 T;1.2.5 删除表中数据在使用表的过程中,可能会需要删除已过期的数据,删除数据必须从表中整行的删除。使用DELETE命令删除行,如果删除表customer_t1中所有c_customer_sk为3869的记录:postgres=# DELETE FROM customer_t1 WHERE c_customer_sk = 3869;如果执行如下命令之一,会删除表中所有的行。postgres=# DELETE FROM customer_t1;或:postgres=# TRUNCATE TABLE customer_t1;全表删除的场景下,建议使用truncate,不建议使用delete。删除创建的表:postgres=# DROP TABLE customer_t1;
  • [技术干货] SQL Server Msdb
    Msdb数据库用来保存数据库备份、SQL Agent信息、DTS程序包和SQL Server任务等信息,以及诸如日志转移这样的复制信息
  • [技术干货] SQL Server Tempdb
    Tempdb数据库存有临时对象,例如全局和本地临时表和存储过程。这个数据库在SQL Server每次重启的时候都会被重新创建,而其中包含的对象是依据模型数据库里定义的对象被创建的。除了这些对象,Tempdb还存有其它对象,例如表变量、来自表值函数的结果集,以及临时表变量。由于Tempdb会保留SQL Server实体上所有数据库的对象类型,所以,对数据库进行优化配置是非常重要的。
  • [技术干货] SQL Server Model
    Model数据库(模型数据库)是一个用来在实体上创建新用户数据库的模版数据库,可以把任何存储过程、视图、用户等放在模型数据库里,这样在创建新数据库的时候,新数据库就会包含存放在模型数据库里的所有对象了。