-
1.首先新建一个空的解决方案,并添加一个类库,代码如下,编译并生产dllusing System; using System.Collections.Generic; using System.Data.SqlTypes; using System.Linq; using System.Text; namespace TEST { public class TestTrans { [Microsoft.SqlServer.Server.SqlFunction] public static SqlString GenerateDecryptString(string name) { string decode = string.Empty; decode = string.Format("HELLO WORLD {0}!", name);//DecryptString(dataXML.Value); SqlString sqlValue = new SqlString(decode); return sqlValue; } } }2.启用CLR功能默认情况下,SQL Server中的CLR是关闭的,所以我们需要执行如下命令打开CLR:exec sp_configure 'clr enabled',1 reconfigure Go3.将程序集引用到数据库中CREATE ASSEMBLY testHelloWorld FROM 'C:\TEST.dll' --('C:/TEST.dll'w为错误写法)4.创建函数CREATE FUNCTION dbo.clrHelloWorld ( @name as nvarchar(200) ) RETURNS nvarchar(200) AS EXTERNAL NAME testHelloWorld.[TEST.TestTrans].GenerateDecryptString5.调用函数SELECT dbo.clrHelloWorld('耿耿')6.执行结果HELLO WORLD 耿耿!
-
一.SQL Server Row_number函数简介ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数。 行号以每个分区中第一行的行号开头以下是ROW_NUMBER()函数的语法实例:select *,row_number() over(partition by column1 order by column2) as n from tablename在上面语法中:PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的行号。PARTITION BY子句是可选的。如果未指定,ROW_NUMBER()函数会将整个结果集视为单个分区。ORDER BY子句定义结果集的每个分区中的行的逻辑顺序。 ORDER BY子句是必需的,因为ROW_NUMBER()函数对顺序敏感。二.Row_number函数的具体用法1.使用row_number()函数对结果集进行编号,如:select ROW_NUMBER() over(order by recordid ) as 编号,* from [dbo].[Basal_Anormal_Solution]运行结果: 2.对结果集按照指定列进行分组,并在组内按照指定列排序(如:把班级的总分按照小组进行分组显示,分组后在组内进行从高分到低分的排序)select *,row_number() over(partition by createby order by actionOpeid) as n from [dbo].[Basal_Anormal_Solution]运行结果: 3.对结果集按照指定列去重(如:对学生成绩按小组进行分组显示,结果集中只显示每组中一位最高分的学生)select a.* from (select *,row_number() over(partition by createby order by actionOpeid) as n from [dbo].[Basal_Anormal_Solution])as a where a.n<2运行结果: 注意:当我们求的是第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果。这个时候就要用到另外一个函数,rank()和dense_rank();rank()和dense_rank()区别:rank()是跳跃排序,有两个第二名时接下来就是第四名。这个时候我们通常会选择用rank()函数,灵活应用。
-
今天看书讲T-SQL,看到了UNBOUNDED PRECEDING,就想比对下ROW_NUMBER()的运行速度。sql及相关的结果如下,数据库中的数据有5W+。ROW_NUMBER(): SET STATISTICS TIME ON SELECT ROW_NUMBER() OVER(ORDER BY Id DESC) rn,Id FROM dbo.T_MyCourse运行结果: UNBOUNDED PRECEDING SET STATISTICS TIME ON SELECT SUM(1) OVER(ORDER BY Id DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) rn,Id FROM dbo.T_MyCourse运行结果: 通过运行之后,看到结果,使用微软官方提供的方法进行编号排序,速度明显的提高。不过我使用上述方法进行分页获取数据的时候结果又有点不一样。分页获取数据:ROW_NUMBER() 分页获取数据:SET STATISTICS TIME ON SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY Id DESC) rn,Id FROM dbo.T_MyCourse )a WHERE a.rn BETWEEN 55 AND 444 执行sql命令:DBCC DROPCLEANBUFFERS ,清除数据库缓存后的结果 UNBOUNDED分页获取数据:SET STATISTICS TIME ON SELECT * FROM ( SELECT SUM(1) OVER(ORDER BY Id DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) rn,Id FROM dbo.T_MyCourse )a WHERE a.rn BETWEEN 22 AND 444 UNBOUNDED这个方式下执行了DBCC DROPCLEANBUFFERS 清除缓存的sql也没有用,执行时间没有变化。通过上述结果,看到ROW_NUMBER()获取分页的数据明显更快,我猜测是微软对ROW_NUMBER()这个方法做了优化,可能是有缓存,读取的缓存中的数据然后进行分页。
-
sql server 锁定模式有三种:共享( S锁),更新(U锁),排他(X锁);S锁是共享锁,如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。个人理解为,对数据A的操作就只能是SELECT ,(联想下,S锁,不就是Select的首字母么),其他事务对A数据的UPDATE ,DELETE都不能进行;U锁是更新锁。用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。原理解释:更新锁 更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁转换为排它 (X) 锁。 如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。 第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。 如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。 个人理解,打个比方,A,B都拿把枪指着对方说:”我等你放下枪我就放下枪“,大家都等对方放下枪,于是就这么死僵持着......X锁是排他锁,也叫独占锁,事务对A资源的insert ,update ,delete要用独占,不然的话乱套了;这是为了保护数据再一次操作中的准确性;个人理解就是,一次一个....
-
Transact-SQLTransact-SQL(又称 T-SQL),是在 Microsoft SQL Server 和 Sybase SQL Server 上的 ANSI SQL 实现,与 Oracle 的 PL/SQL 性质相近(不只是实现 ANSI SQL,也为自身数据库系统的特性提供实现支持),在 Microsoft SQL Server 和 Sybase Adaptive Server 中仍然被使用为核心的查询语言。数据库1、创建数据库USE master ; GO CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\saledat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Sales_log, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) ; GO2、查看数据库SELECT name, database_id, create_date FROM sys.databases ;3、删除数据库DROP DATABASE Sales;表1、创建表CREATE TABLE PurchaseOrderDetail ( ID uniqueidentifier NOT NULL ,LineNumber smallint NOT NULL ,ProductID int NULL ,UnitPrice money NULL ,OrderQty smallint NULL ,ReceivedQty float NULL ,RejectedQty float NULL ,DueDate datetime NULL );2、删除表DROP TABLE dbo.PurchaseOrderDetail;3、重命名表EXEC sp_rename 'Sales.SalesTerritory', 'SalesTerr';列1、添加列ALTER TABLE dbo.doc_exa ADD column_b VARCHAR(20) NULL, column_c INT NULL ;2、删除列ALTER TABLE dbo.doc_exb DROP COLUMN column_b;3、重命名列EXEC sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';约束1、主键--在现有表中创建主键 ALTER TABLE Production.TransactionHistoryArchive ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID); --在新表中创建主键 CREATE TABLE Production.TransactionHistoryArchive1 ( TransactionID int IDENTITY (1,1) NOT NULL , CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID) ) ; --查看主键 SELECT name FROM sys.key_constraints WHERE type = 'PK' AND OBJECT_NAME(parent_object_id) = N'TransactionHistoryArchive'; GO --删除主键 ALTER TABLE Production.TransactionHistoryArchive DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID; GO视图1、创建视图CREATE VIEW V_EmployeeHireDate AS SELECT p.FirstName, p.LastName, e.HireDate FROM HumanResources.Employee AS e JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ; GO2、删除视图DROP VIEW V_EmployeeHireDate;存储过程1、创建存储过程CREATE PROCEDURE P_UspGetEmployeesTest @LastName nvarchar(50), @FirstName nvarchar(50) AS SELECT FirstName, LastName, Department FROM HumanResources.vEmployeeDepartmentHistory WHERE FirstName = @FirstName AND LastName = @LastName AND EndDate IS NULL; GO2、删除存储过程DROP PROCEDURE P_UspGetEmployeesTest;3、执行存储过程EXEC P_UspGetEmployeesTest N'Ackerman', N'Pilar'; -- Or EXEC P_UspGetEmployeesTest @LastName = N'Ackerman', @FirstName = N'Pilar'; GO -- Or EXECUTE P_UspGetEmployeesTest @FirstName = N'Pilar', @LastName = N'Ackerman'; GO4、重命名存储过程EXEC sp_rename 'P_UspGetAllEmployeesTest', 'P_UspEveryEmployeeTest2';5、带有输出参数的存储过程CREATE PROCEDURE P_UspGetEmployeeSalesYTD @SalesPerson nvarchar(50), @SalesYTD money OUTPUT AS SELECT @SalesYTD = SalesYTD FROM SalesPerson AS sp JOIN vEmployee AS e ON e.BusinessEntityID = sp.BusinessEntityID WHERE LastName = @SalesPerson; RETURN GO --调用 DECLARE @SalesYTDBySalesPerson money; EXECUTE P_UspGetEmployeeSalesYTD N'Blythe', @SalesYTD = @SalesYTDBySalesPerson OUTPUT; GO数据类型
-
由于工作需要,需要把数据把列根据指定的内容拆分数据其中一条数据实例 select id , XXXX FROM BIZ_PAPER where id ='4af210ec675927fa016772bf7dd025b0' 拆分方法:select t3.id ,t3.XXXX as XXXX from ( select A.id , B.XXXX from ( SELECT id, XXXX = CONVERT(xml,'<root><v>' + REPLACE(XXXX , ',', '</v><v>') + '</v></root>') FROM BIZ_PAPER) A outer apply( SELECT XXXX = N.v.value('.', 'varchar(100)') FROM A.XXXX .nodes('/root/v') N(v)) B) t3 where t3.id ='4af210ec675927fa016772bf7dd025b0'结果在自己研究这行代码之后,做出如下讲解,如果有错误的地方还请指教SELECT id, XXXX = CONVERT(xml,'<root><v>' + REPLACE(XXXX , ',', '</v><v>') + '</v></root>') FROM BIZ_PAPER这一行的重点在于CONVERT,XML是指类型,xml 数据类型实例拆分为关系数据,则 nodes() 方法非常有用,至于XML类型的数据,我后面进行补充REPLACE 指按照 ' , ' 进行替换,并且按照指定的内容进行拼接最后的结果为outer apply这个就是表的关联,就像是left join ,但是没有on 作为关联条件,所以通过拆分之后多出来的数据就是通过这个进行关联后产生的SELECT XXXX = N.v.value('.', 'varchar(100)') FROM A.XXXX .nodes('/root/v') N(v)N.v.value('.','varchar(100)'),N是表,别名,v是列,value函数是读取标签之间的值,对于这个列子,读取的为<v>和</v>中间的值;这个可以去了解 xml类型的常用的三个方法 :value()、nodes()、exist() value的第一个参数是一个字符串文字,从 XML 实例内部检索数据。 XQuery 必须最多返回一个值。 否则,将返回错误;value的第二个参数是指将查询结果转化为何种类型的数据。此处,'.'表示当前目录,即<v>目录,另外'..'表示上级目录,'/'表示根目录,这个跟Linux是一样的总的来说,这个语句的重点在于xml类型的使用和outer apply的使用,其他的都很好理解。这个就是我自己理解后的讲解,部分位置我自己也还没有理解透
-
概述: 为什么使用集合运行: 在集合运算中比联接查询和EXISTS/NOT EXISTS更方便。并级运算(UNION)并集:俩个集合的并集是一个包含的A和B的中所有的元素。 在T-SQL中。UNION集合运算可以将两个输入查询的结果组合成一个结果集。需要注意的是:如果一个行在任何一个输入集合中出现,它也会在UNION运算的结果中出现。T-SQL支持以下两种选项:(1)UNION ALL:不会删除重复行-- union allselect country, region, city from hr.Employees union all select country, region, city from sales.Customers;(2)UNION:会删除重复行-- union select country, region from hr.Employees union select country, region from sales.Customers;交集运算(INTERSECT)交集:两个集合(记为集合A和集合B)的交集是由既属于A,也属于B的所有元素组成的集合。 在T-SQL中,INTERSECT集合运算对两个输入查询的结果取其交集,只返回在两个查询结果集中都出现的行。INTERSECT集合运算在逻辑上会首先删除两个输入集中的重复行,然后返回只在两个集合中中都出现的行。换句话说:如果一个行在两个输入集中都至少出现一次,那么交集返回的结果中将包含这一行。例如,下面返回既是雇员地址,又是客户地址的不同地址:-- intersect select country, region, city from hr.Employees intersect select country, region, city from sales.Customers;这里需要说的是,集合运算对行进行比较时,认为两个NULL值相等,所以就返回该行记录。差集运算(EXCEPT)差集:两个集合(记为集合A和集合B)的由属于集合A,但不属于集合B的所有元素组成的集合。 在T-SQL中,集合之差使用EXCEPT集合运算实现的。它对两个输入查询的结果集进行操作,反会出现在第一个结果集中,但不出现在第二个结果集中的所有行。 EXCEPT结合运算在逻辑上首先删除两个输入集中的重复行,然后返回只在第一个集合中出现,在第二个结果集中不出现的所有行。 换句话说:一个行能够被返回,仅当这个行在第一个输入的集合中至少出现过一次,而且在第二个集合中一次也没出现过。 此外,相比UNION和INTERSECT,两个输入集合的顺序是会影响到最后返回结果的。 例如,借助EXCEPT运算,我们可以方便地实现属于A但不属于B的场景,下面返回属于员工抵制,但不属于客户地址的地址记录:-- except select country, region, city from hr.Employees except select country, region, city from sales.Customers;集合运算优先级 SQL定义了集合运算之间的优先级:INTERSECT最高,UNION和EXCEPT相等。 换句话说:首先会计算INTERSECT,然后按照从左至右的出现顺序依次处理优先级相同的运算。-- 集合运算的优先级 select country, region, city from Production.Suppliers except select country, region, city from hr.Employees intersect select country, region, city from sales.Customers;上面这段SQL代码,因为INTERSECT优先级比EXCEPT高,所以首先进行INTERSECT交集运算。因此,这个查询的含义是:返回没有出现在员工地址和客户地址交集中的供应商地址。集合运算的优先级1.INTERSECT>UNION=EXCEPT2.首先计算INTERSECT,然后从左到右的出现顺序依次处理优先级的相同的运算。3.可以使用圆括号控制集合运算的优先级,它具有最高的优先级。在排序函数的OVER字句中使用ORDER BY ( SELECT <常量> )可以告诉SQL Server不必在意行的顺序。使用表表达式避开不支持的逻辑查询处理集合运算查询本身并不持之除ORDER BY意外的其他逻辑查询处理阶段,但可以通过表表达式来避开这一限制。 解决方案就是:首先根据包含集合运算的查询定义一个表表达式,然后在外部查询中对表表达式应用任何需要的逻辑查询处理。(1)例如,下面的查询返回每个国家中不同的员工地址或客户地址的数量:select country, COUNT(*) as numlocations from (select country, region, city from hr.Employees union select country, region, city from sales.Customers) as Ugroup by country;(2)例如,下面的查询返回由员工地址为3或5的员工最近处理过的两个订单:select empid,orderid,orderdate from (select top (2) empid,orderid,orderdate from sales.Orders where empid=3 order by orderdate desc,orderid desc) as D1 union all select empid,orderid,orderdate from (select top (2) empid,orderid,orderdate from sales.Orders where empid=5 order by orderdate desc,orderid desc) as D2;
-
数据库这个大家庭里,还有一位不容小觑的成员云数据库SQL Server什么是云数据库SQL Server ?Microsoft SQL Server是世界上最受欢迎的商用关系型数据库集成各类管理开发工具。云数据库SQL Server为微软正版授权,完美支持基于Windows架构的应用程序,性能与性价比兼具。云数据库SQL Server优势高用同城高可用架构,自动故障秒级切换高安全14项国际安全合规认证,有效抵御网络攻击全面监控报警专业管理运维平台,多维系统资源监控,自定义报警配置高性价比微软SQL Server企业版授权许可,无需支付版权费用云数据库SQL Server应用场景金融行业支持VPC、子网设置实现网络隔离安全组设置提供访问控制保证数据安全[提供灵活备份方案支持高可靠业务需求互联网行业兼容微软SQL Server 线下数据库迁移上云优秀事务并发处理能力保证数据可靠和稳定要求弹性扩容,匹配业务,节省成本移上云软件开发行业无缝对接微软集成开发工具,缩短开发周期使用微软原生可视化管理工具 |,降低运维难度和成本
-
场景排查1. ECS能否ping通RDS。如果ping不通,可以查看ECS和RDS是否处于同一个VPC内,是否使用同一个安全组。2. 检查连接IP和端口号是否正确。注意IP和端口号之间使用“逗号”隔开。3. 检查RDS服务的运行状态是否异常。4.查看用户名密码是否正确,尝试重置密码。5. 尝试重启RDS实例,看看是否改善。解决方案步骤 1 登录管理控制台,选择区域和项目,选择“数据库 > 关系型数据库”。进入关系型数据库“实例管理”页面,单击目标实例名称,进入“基本信息”页面和“备份恢复”页面确定连接信息和备份信息。步骤 2 在实例“基本信息”页面查看管理员账户名。步骤 3 下载并在ECS上安装SSMS客户端。步骤 4 从ECS连接到RDS。
-
今天和大家聊一聊SQL server的内存管理,说之前我们需要先提出一个问题,SQL Server到底是如何使用内存的?弄清楚如何使用之后,才能谈如何管理。简单说,SQL Server 数据库的内存使用原则是有多少内存就会占用多少内存,不会自动释放内存。原因是它的存储引擎本身是一个Windows下的进程,所以在使用内存时和其它Windows进程是一样的,都要向Windows申请内存,申请到内存之后,SQL Server的内存使用可以粗略地分为两个部分:一是缓冲池内存,被数据页和空闲页占用;二是非缓冲内存,被线程、DLL、链接服务器等占用。其中缓冲池内存占大头。这样会有什么问题呢?打个比方,如在执行一条结果集很大的 sql 时,数据查询取出后,会一直占用内存,直到机器内存被占满(并不会撑爆,因为可以通过图去限制最大内存,一般占满后仍然比服务器机器内存稍小),在重启数据库服务前,SQL Server不会主动释放该内存,也没有任何办法可人为释放,一直占用到 max server memory 的设定值,因此查看 SQL Server的内存基本使用率相对较高(80%以上)。 那怎么解决呢?最直接的办法是:人为修改最大可占用物理内存进行限制。方法一:缓冲池所占内存是通过下图1最大服务器内存和最小服务器内存来设置的,因此sqlservr.exe所占的内存(如图2)有可能会大于图1中所设置的最大内存。管理员用户登录数据库客户端(Microsoft SQL Server Management Studio),在实例名(树形菜单根节点,显示登录名那栏)上右键,选择属性-->内存,设置“最大服务器内存”即可根据实际情况调整内存(单位为MB),如调整到当前总的服务器内存的 70%左右使用率。图1 SQL Server可控制内存选项图2 SQL Server 进程内存使用情况方法二:如果使用的是华为云RDS SQL Server ,那解决方法就更加简单了,只需要到控制台实例管理中修改最大内存(max server memory)参数值即可,且修改完该参数不需要重启数据库,不得不说云数据库使用起来更加便捷清晰,更多华为云RDS SQL Server的使用可参考官方文档:https://support.huaweicloud.com/rds/index.html
-
背景:用友U8线下盒子账号需要在华为公有云端进行部署安装,在用户将应用端安装到ECS虚拟机上之后,还需要创建RDS SQL Server,并远程指定该实例作为后端数据库,同时需要在该实例上进行U8数据库初始化操作,具体操作流程如下。 步骤:1.创建RDS SQL Server实例,通过华为云DAS数据库在线管理工具直接登录该实例点击实例进入实例详情页,在基本信息Tag页的右上角点击登录按钮2.在DAS在线管理界面点击SQL窗口,在新窗口中输入以下脚本并直接执行(也可以通过SSMS官方客户端连接执行):拷贝以下脚本到窗口中直接执行:-- 创建数据库USE master;goIF DB_ID (N'U8CLOUD') IS NOT NULLDROP DATABASE [U8CLOUD];goCREATE DATABASE [U8CLOUD] ALTER DATABASE [U8CLOUD] ADD FILEGROUP [NNC_DATA01] ALTER DATABASE [U8CLOUD] ADD FILEGROUP [NNC_DATA02] ALTER DATABASE [U8CLOUD] ADD FILEGROUP [NNC_DATA03] ALTER DATABASE [U8CLOUD] ADD FILEGROUP [NNC_INDEX01] ALTER DATABASE [U8CLOUD] ADD FILEGROUP [NNC_INDEX02] ALTER DATABASE [U8CLOUD] ADD FILEGROUP [NNC_INDEX03] ALTER DATABASE [U8CLOUD] ADD FILE(NAME = N'nnc_data01', FILENAME = N'D:\RDSDBDATA\DATA\nnc_data01_Data.NDF' , SIZE = 500, FILEGROWTH = 200) TO FILEGROUP [NNC_DATA01] ALTER DATABASE [U8CLOUD] ADD FILE(NAME = N'nnc_data02', FILENAME = N'D:\RDSDBDATA\DATA\nnc_data02_Data.NDF' , SIZE = 500, FILEGROWTH = 200) TO FILEGROUP [NNC_DATA02] ALTER DATABASE [U8CLOUD] ADD FILE(NAME = N'nnc_data03', FILENAME = N'D:\RDSDBDATA\DATA\nnc_data03_Data.NDF' , SIZE = 500, FILEGROWTH = 200) TO FILEGROUP [NNC_DATA03] ALTER DATABASE [U8CLOUD] ADD FILE(NAME = N'nnc_index01', FILENAME = N'D:\RDSDBDATA\DATA\nnc_index01_Data.NDF' , SIZE = 200, FILEGROWTH = 100) TO FILEGROUP [NNC_INDEX01] ALTER DATABASE [U8CLOUD] ADD FILE(NAME = N'nnc_index02', FILENAME = N'D:\RDSDBDATA\DATA\nnc_index02_Data.NDF' , SIZE = 200, FILEGROWTH = 100) TO FILEGROUP [NNC_INDEX02] ALTER DATABASE [U8CLOUD] ADD FILE(NAME = N'nnc_index03', FILENAME = N'D:\RDSDBDATA\DATA\nnc_index03_Data.NDF' , SIZE = 200, FILEGROWTH = 100) TO FILEGROUP [NNC_INDEX03]--修改数据库字符集ALTER DATABASE [U8CLOUD] COLLATE Chinese_PRC_CI_ASGO--切换数据库use U8CLOUDgo --启用快照隔离declare @exec_stmt nvarchar(4000) select @exec_stmt='ALTER DATABASE '+db_name()+' set read_committed_snapshot ON ' exec (@exec_stmt) 3.返回实例管理详情页:1.在左侧点击参数修改进入参数修改页面2.在查询框中输入max查找参数3.找到max degree of parallelism 将其值修改为14.点击保存完成操作 4.临时数据库不用再改了,已经是最佳实践
-
操作场景 华为云SQL Server提供存储过程,用于收缩数据库的数据文件和日志文件,以释放磁盘部分空间。操作步骤 连接RDS for SQL Server实例,执行以下命令,进行数据库收缩。 EXEC [master].[dbo].[rds_shrink_database] @DBName = 'myDBName'; 参数 myDBName: 要收缩的数据库名称。如果未指定,则默认对所有数据库进行收缩。 结果A.结果集返回多个结果集,每个结果对应指定数据库(或所有数据库)的每个文件的相关信息。结果集结构如下:列名称说明DbId当前收缩的文件的数据库标识号。FileId当前收缩的文件的文件标识号。CurrentSize文件当前占用的 8 KB 页数。MinimumSize文件最低可以占用的 8 KB 页数。 此数字对应于文件的大小下限或最初创建大小。UsedPages文件当前使用的 8 KB 页数。EstimatedPages数据库引擎估计文件能够收缩到的 8 KB 页数。 B. 消息打印命令执行进度。最佳实践Ø 在执行会产生大量未用空间的操作(如重启)后,执行收缩操作最有效Ø 大多数数据库都需要一些可用空间,以供常规日常操作使用。 如果反复收缩数据库,并且它的大小再次增长,那么常规操作可能需要收缩空间。 在这种情况下,反复收缩数据库是一种无谓的操作。Ø 收缩操作不保留数据库中索引的碎片状态,通常还会在一定程度上增加碎片。 此类碎片是不要反复收缩数据库的另一个原因。故障排除l 文件未收缩1. 如果在执行存储过程后文件大小未改变,请运行以下SQL,验证文件是否有足够的可用空间:SELECT name, size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB FROM sys.database_files; 2. 如果要收缩的数据库文件大小不超过50MB,对该文件的收缩将不起作用。且会打印相关提示。如: l 收缩操作受阻基于行版本控制的隔离级别下运行的事务可能会阻止收缩操作。若要解决此问题,请执行下列任务之一:² 终止阻止收缩操作的事务。² 终止收缩操作。 如果收缩操作终止,所有已完成的工作都会保留。² 不执行任何操作,并允许收缩操作等到阻塞事务完成。示例 收缩指定数据库 以下示例将 dbtest2 数据库进行收缩。EXEC [master].[dbo].[rds_shrink_database] @DBName = 'dbtest2';执行结果如下: 收缩所有数据库以下示例将收缩所有数据库。EXEC [master].[dbo].[rds_shrink_database];
-
随着互联网的迅速发展,以数据库为基础的信息系统在各行各业基础设施建设中得到了广泛的应用,越来越多的数据信息被搜集、存储以及发布,其中大量信息被用于行业合作和数据共享。但是由于信息的易获取,这些包含在数据库系统中的关于商业或技术机密、个人隐私等涉密信息将面临更多的安全威胁。数据泄漏无处不在,且愈演愈烈。因此,数据加密尤为重要。数据库透明加密技术是针对关系型数据库保密需求应运而生的一种数据库加密技术。透明数据加密(Transparent Data Encryption,简称TDE),通过证书加密数据文件和备份文件,可进行实时的io加密/解密,能有效保护数据库及数据文件的安全。RDS for SQL server提供透明数据库加密功能,为您的数据保驾护航。开启实例级别的TDE加密功能1.登录管理控制台。2.单击管理控制台左上角的,选择区域和项目。3.选择“数据库 > 云数据库 RDS”。进入云数据库 RDS信息页面。4.在“实例管理”页面,单击目标实例名称,进入实例的“基本信息”页面。5.在“数据库信息”模块,单击“TDE状态”后的。 图1 开启实例级别的TDE加密功能6.在弹出框中,单击“确定”进行二次确认后,开启TDE加密功能。 说明:实例级别的TDE加密功能一旦开启,将不允许关闭,请您谨慎操作。设置数据库级别的TDE加密功能 在开启数据库级别的TDE加密功能之前,请确保已成功开启实例级别的TDE加密功能。 1.连接目标实例。 请参考通过公网连接SQL Server实例、通过内网连接SQL Server实例及通过DAS连接SQL Server实例。 2.通过rds_tde存储过程开启、关闭或查询TDE加密功能。 exec master.dbo.rds_tde DatabaseName,TDE_ActionDatabaseName:目标数据库名,取值可为null。TDE_Action:取值为“-1”,表示查询目标库加密信息。 如果“DatabaseName”取值为null,则返回所有库的加密状态。取值为“0”,表示关闭目标库TDE加密功能。取值为“1”,表示开启目标库TDE加密功能。 3.开启数据库db1的TDE加密功能: exec master.dbo.rds_tde db1, 1 4.关闭数据库db1的TDE加密功能: exec master.dbo.rds_tde db1, 0 5.查询数据库db1的TDE加密状态: exec master.dbo.rds_tde db1, -1 6.查询所有数据库的TDE加密状态: exec master.dbo.rds_tde null, -1更多相关介绍,欢迎查看https://support.huaweicloud.com/usermanual-rds/rds_11_0004.html
-
数据库性能诊断和优化是提高数据库性能和稳定性的关键技术之一。快速的发现问题、定位根因并且进行止损,是每个用户的需求。华为云SQL Server提供了慢SQL 审计功能,基于原生的审计功能,较以往更加强大,SQL审计功能会将会对服务级、数据库级、表级的主要变更操作记录进审计日志文件,可以帮助您更快速的定位和解决问题。 为什么要开启慢SQL审计 查询日志用来记录执行时间超过当前慢日志阈值“long_query_time”(默认是1秒)的语句,您可以通过慢查询日志的日志明细,查找出执行效率低的语句,进行优化。您可以一键开通当前实例的慢 SQL 审计功能,并通过下载慢日志文件对当前实例上运行的慢 SQL 进行业务分析和判断。 如何查看慢日志1. 登录管理控制台。2. 单击管理控制台左上角的,选择区域和项目。3. 选择“数据库 > 云数据库 RDS”。进入云数据库 RDS信息页面。4. 在“实例管理”页面,选择目标实例,单击实例名称,进入实例的“基本信息”页签。5. 在左侧导航栏单击“日志管理”,在“运行日志”页签下,选择“下载”页签。6. 在“下载”页面,记录所生成的审计日志文件名。说明:1. 审计日志文件名称以RDSAudit开头,会自动添加GUID和时间戳组合为文件名。2. RDS for SQL Server实例将默认开启SQL审计功能,并且不支持关闭。7. 通过SQL Server客户端连接目标实例。8. 目标实例连接成功后,通过执行如下sql查看审计日志详情。select*from msdb.dbo.rds_fn_get_audit_file(file_pattern, initial_file_name, audit_record_offset)file_pattern9. 指定要读取的审核文件集目录(或路径)和文件名。initial_file_name10. 指定审核文件集中要开始读取审核记录的特定文件的路径和名称。audit_record_offset11. 指定一个已知位置,该位置包含initial_file_name指定的文件。如何下载慢日志1. 登录管理控制台。2. 单击管理控制台左上角的,选择区域和项目。3. 选择“数据库 > 云数据库 RDS”。进入云数据库 RDS信息页面。4. 在“实例管理”页面,选择目标实例,单击实例名称,进入实例的“基本信息”页签。5. 在左侧导航栏单击“日志管理”,在“运行日志”页签下,选择“下载”页签。6. 选择目标日志文件,单击操作列中的“下载”。l 系统会在“下载”弹出框中自动加载下载准备任务,加载时长受日志文件大小及网络环境影响。n 下载准备过程中,状态显示为“准备中...”。n 下载准备完成,状态显示为“准备完成”。n 下载准备工作失败,状态显示为“异常”。l 在“下载”弹出框中,对于“准备完成”的日志文件,单击“确定”,下载审计日志。单击“取消”,则不下载审计日志文件,直接返回下载页签。下载链接有效期为5分钟。如果超时,提示用户下载链接已失效,关闭窗口后执行重新下载日志文件。如果您想对 SQL Server 数据库进行优化那就赶紧使用起来吧!了解更多,请戳我...
-
背景说明:SQL Server数据库采用的同步方案,均只包含同步数据库粒度的内容,数据库以外实例上的内容默认都是不同步的,这些内容中常用的包括:Linked Servers,Agent Job所以当用户的RDS SQL Server 高可用实例发生主备切换后,用户需要主动在新的主节点上重新创建以上内容 操作说明:SQL Server 实例级功能目前在RDS托管实例上常用的有:Linked Servers,Agent Job Linked Servers:即SQL Server外部链接服务,主要用于从远程数据源中读取数据,并针对 SQL Server 实例之外的 OLE DB 数据源等远程数据库服务器执行命令。官网链接详见:https://docs.microsoft.com/zh-cn/sql/relational-databases/linked-servers/linked-servers-database-engine?view=sql-server-2017 主备切换后,你需要通过以下方式来进行手动同步创建操作:1.主备切换之前,通过微软提供的官方SSMS客户端工具连接你的主实例,保存好你的DBlink创建脚本,具方法如下:在服务器对象-->连接服务器下找到你当前实例的DBLink连接。2.选中链接服务器,然后点击F7,会自动弹出对象资源管理信息页,在该页面中可以方便你快速的创建Create脚本,具体如下: 3.接着你可以在新窗口中看到你当前实例上所有DBLink的创建脚本,仅需Copy该脚本进行保存,并注意修改@rmtpassword上的密码即可后续再新主节点上进行创建。USE [master]GO /****** Object: LinkedServer [DRS_TEST_REMOTE] Script Date: 2019/5/25 17:51:50 ******/EXEC master.dbo.sp_addlinkedserver @server = N'DRS_TEST_REMOTE', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'DESKTOP-B18JH5T\SQLSERVER2016EE' /* For security reasons the linked server remote logins password is changed with ######## */EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'DRS_TEST_REMOTE',@useself=N'False',@locallogin=NULL,@rmtuser=N'sa',@rmtpassword='########'GO 备注:以上脚本为范例,创建的脚本可能包含大量系统默认配置项,但是每个DBLink仅需保留以下两个关键脚本即可执行成功,同时需要注意重新输入账号连接密码 Agent JOB:又名SQL Server代理服务,可以方便用户快速的在实例上创建定时任务,帮助用户进行日常运维和数据处理工作.官网链接详见:https://docs.microsoft.com/zh-cn/sql/ssms/agent/sql-server-agent?view=sql-server-2017 主备切换后,你需要通过以下方式来进行手动同步创建操作:1.通过微软提供的官方SSMS客户端工具连接你的RDS实例,同时在SQL Server代理-->作业下找到你当前实例上的所有JOB任务:2.点击选中SQL Server代理下的作业,然后点击F7,可以在对象资源管理器中看到所有的JOB作业,全部选中后点创建脚本到新窗口:3.Copy新窗口中的T-SQL创建脚本进行保存,然后注意修改如下几个关键项,以保障你后面的创建成功:a.注意修改你的每个JOB上的Ower账号:例如:@owner_login_name=N'rdsuser' 备注:1.新建JOB的Owner账号十分重要,在RDS SQL Server上,仅有该JOB的Owner可以看到实例上自己的JOB,别的Login账号是看不到无法操作的,所以建议所有的JOB Owner尽量是同一个账号方便管理。2.sys打头的JOB属于系统JOB不需要进行同步,请注意识别。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签