-
16.sql server触发器、游标、视图、函数、字段、逻辑删除、主从数据库同步
2021-03-02 12:31:08Database目标环境准备:一.触发器二.游标三.视图四.函数五.字段类型六.字段可空七....如何解决呢?...Microsoft SQL Server Management Studio 18 2012以上; 一.触发器 是一个特殊的存储过程,是由数据库目标
1.触发器
2.游标&&视图&&函数
3.字段类型&&字段可空
4.统计字段&&逻辑删除
5.数据库设计落地实操环境准备:
Microsoft SQL Server Management Studio 18 2012以上;
一.触发器
是一个特殊的存储过程,是由数据库自己在某种场景下触发的;自然是去执行一些业务逻辑;
A.事发前----Insert,插入一条数据之前,可以指定一个知性逻辑
B.事发之后—Update,触发点什么动作;user 表冗余公司表的公司名称,公司名称修改后,需要在使
用了公司名称的表中去更新数据;就可以使用触发器;
建议:建议大家少用,一定要注意嵌套式触发器
坑:系统性能,容易造成死循环;二.游标
游标是从一个数据结果集中获取某一个数据;比较冷门;
三.视图
在系统中,可以说是必备的;专用用来做查询操作;
一个虚拟的表,由一条复杂的Sql语句来完成的;
----主要是一个种补救措施;
缺陷:性能没有保障;四.函数
更多的是使用的系统函数;
建议—建议大家最多就是去使用系统函数;也可以自定义函数,字段在使用函数以后,不会索引;----函
数毁索引。五.字段类型
表和表之间同一字段----一定要定义为同一个类型;如果同一字段类型不一致,语句查询会报错,肯定需
要来函数处理----会影响性能—不走索引;六.字段可空
数值类型的 不要可空;
in查询 not in查询 会没有结果,,一般给个默认值
也有特殊场景:可以为空;创建时间
默认值:创建时间----当前时间,存金额(不要设置默认值)七.统计字段
完全是为了我们程序开发者便捷而存在的,数据不丢失;
创建时间、创建人、最后更新时间、最后更新人、state、isEnable
假删除/软删除–state----如果要删除,不是直接把数据给干掉了,没有delete语句,只是把数据状态修
改,表示当前数据不可用了,当前数据不丢失;
软删除后,查询的时候,需要增加判断条件;设计:
权限=通过角色配置的权限+临时权限
求并集—视图
展示界面的时候没有的权限是不能展示出来,在操作的时候需要拦截验证权限;----业务操作不能完全信
赖客户端;如果表太多,需要确定权限------必然会影响性能;
如何解决呢?
- 缓存(程序缓存)----推荐----关联查询只查询一次;查询之后就缓存起来;后续就直接到缓存中去取;
如果权限重新配置了,记得刷新缓存; - 还可以把设置到的权限数据保存到一个表(还是缓存)中去(保存到用户中的某一个字段中)
多级菜单:
怎么保存?ParentId(父级Id),当前按钮信息保存一个父级Id,如果要获取菜单,就可以通过最高级,获
取到最后一集;
多级code拼接
层级
都是违背了范式,但是这里的情况,我比较推崇大家这样做;
设计审批流:
1.设置审批环节—
主从数据库同步
如果遇到,从数据库的值要和主数据库一样。可以现查询最新的。老师讲的好像有点老
- 缓存(程序缓存)----推荐----关联查询只查询一次;查询之后就缓存起来;后续就直接到缓存中去取;
-
SQL Server数据库练习——游标
2020-05-25 19:28:31文章目录SQL Server数据库基础知识游标概述游标是什么?游标如何使用?游标使用示例 游标是什么? 游标是SQL 的一种数据访问机制。可以将游标简单的看成是查询的结果集的一个指针,可以根据需要在结果集上面来回...游标概述
游标是什么?
游标是SQL 的一种数据访问机制。可以将游标简单的看成是查询的结果集的一个指针,可以根据需要在结果集上面来回滚动,浏览需要的数据。
游标如何使用?
一般地,使用游标都遵循下列的常规步骤:
(1) 声明游标。把游标与T-SQL语句的结果集联系起来。(2) 打开游标。
(3) 使用游标操作数据。
(4) 关闭游标。
(5) 删除/释放游标。
游标使用示例
下面用一张表格向大家演示游标的使用。
需求:根据价格设置每本书的等级
价格<50——等级:便宜价格在50-100之间——等级:中等
价格>100——等级:贵
--定义一个游标 declare cur_set_lever cursor --声明一个名为cur_set_lever的游标 for select ID,Price from books --for为了做什么 --打开游标 open cur_set_lever --获取数据,ID,Price --定义两个变量来存数据。注意,定义的变量的类型应该与数据库中对应字段的类型一致。 declare @id int declare @price decimal(18,2) --拿数据/读取数据 fetch next from cur_set_lever into @id,@price --读取第一行的数据 --打印数据 --print @id --循环获取 while(@@FETCH_STATUS=0) --@@FETCH_STATUS=0,成功执行fetch语句 begin --修改等级 if(@price<50) update books set Levels='便宜' where ID=@id else if(@price<100) update books set Levels='中等' where ID=@id else update books set Levels='贵' where ID=@id fetch next from cur_set_lever into @id,@price --在循环体内将读取其余行数据 end --关闭游标 close cur_set_lever --删除/释放游标 deallocate cur_set_lever --查询是否修改成功 select*from books --附: --参数说明: --NEXT 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。 --每执行一个FETCH操作之后,通常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。该变量有三种状态值: --? 0 表示成功执行FETCH语句。 --? -1 表示FETCH语句失败,例如移动行指针使其超出了结果集。 --? -2 表示被提取的行不存在。 --由于@@FETCH_STATU是全局变量,在一个连接上的所有游标都可能影响该变量的值。因此,在执行一条FETCH语句后,必须在对另一游标执行另一FETCH 语句之前测试该变量的值才能作出正确的判断。
最终,执行成功后查询出的结果如图所示:所有的书籍都根据价格分成了对应的等级。
-
如何在SQL Server中快速删除重复记录
2019-01-08 04:44:17如何在SQL Server中快速删除重复记录 开发人员的噩梦——删除重复记录 想必每一位开发人员都有过类似的经历,在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而导致查询和统计结果不准确。...如何在SQL Server中快速删除重复记录
开发人员的噩梦——删除重复记录
想必每一位开发人员都有过类似的经历,在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而导致查询和统计结果不准确。解决该问题的办法就是将这些重复的记录删除,只保留其中的一条。
在SQL Server中除了对拥有十几条记录的表进行人工删除外,实现删除重复记录一般都是写一段代码,用游标的方法一行一行检查,删除重复的记录。因为这种方法需要对整个表进行遍历,所以对于表中的记录数不是很大的时候还是可行的,如果一张表的数据达到上百万条,用游标的方法来删除简直是个噩梦,因为它会执行相当长的一段时间。
四板斧——轻松消除重复记录
殊不知在SQL Server中有一种更为简单的方法,它不需要用游标,只要写一句简单插入语句就能实现删除重复记录的功能。为了能清楚地表述,我们首先假设存在一个产品信息表Products,其表结构如下:
CREATE TABLE Products (
ProductID int,
ProductName nvarchar (40),
Unit char(2),
UnitPrice money
)
表中的数据如图1:
图1中可以看出,产品Chang和Tofu的记录在产品信息表中存在重复。现在要删除这些重复的记录,只保留其中的一条。步骤如下:
第一板斧——建立一张具有相同结构的临时表
CREATE TABLE Products_temp (
ProductID int,
ProductName nvarchar (40),
Unit char(2),
UnitPrice money
)
第二板斧——为该表加上索引,并使其忽略重复的值
方法是在企业管理器中找到上面建立的临时表Products _temp,单击鼠标右键,选择所有任务,选择管理索引,选择新建。如图2所示。
按照图2中圈出来的地方设置索引选项。
第三板斧——拷贝产品信息到临时表
insert into Products_temp Select * from Products
此时SQL Server会返回如下提示:
服务器: 消息 3604,级别 16,状态 1,行 1
已忽略重复的键。
它表明在产品信息临时表Products_temp中不会有重复的行出现。
第四板斧——将新的数据导入原表
将原产品信息表Products清空,并将临时表Products_temp中数据导入,最后删除临时表
Products_temp。
delete Products
insert into Products select * from Products_temp
drop table Products_temp
这样就完成了对表中重复记录的删除。无论表有多大,它的执行速度都是相当快的,而且因为几乎不用写语句,所以它也是很安全的。
小提示:上述方法中删除重复记录取决于创建唯一索引时选择的字段,在实际的操作过程中读者务必首先确认创建的唯一索引字段是否正确,以免将有用的数据删除。 -
SQL Server 2000删除表中的重复记录
2008-12-18 18:27:00在SQL Server中除了对拥有十几条记录的表进行人工删除外,实现删除重复记录一般都是写一段代码,用游标的方法一行一行检查,删除重复的记录。... SQL Server 2000如何删除表中的重复记录(记录完全相同才在SQL Server中除了对拥有十几条记录的表进行人工删除外,实现删除重复记录一般都是写一段代码,用游标的方法一行一行检查,删除重复的记录。因为这种方法需要对整个表进行遍历,所以对于表中的记录数不是很大的时候还是可行的,如果一张表的数据达到上百万条,用游标的方法来删除简直是个噩梦,因为它会执行相当长的一段时间.
SQL Server 2000如何删除表中的重复记录(记录完全相同才算重复记录)?
四板斧——轻松消除重复记录
殊不知在SQL Server中有一种更为简单的方法,它不需要用游标,只要写一句简单插入语句就能实现删除重复记录的功能。为了能清楚地表述,我们首先假设存在一个产品信息表Products,其表结构如下:CREATE TABLE Products (
ProductID int,
ProductName nvarchar (40),
Unit char(2),
UnitPrice money
)
表中的数据如图1:
图1中可以看出,产品Chang和Tofu的记录在产品信息表中存在重复。现在要删除这些重复的记录,只保留其中的一条。步骤如下:
第一板斧——建立一张具有相同结构的临时表CREATE TABLE Products_temp (
ProductID int,
ProductName nvarchar (40),
Unit char(2),
UnitPrice money
)
第二板斧——为该表加上索引,并使其忽略重复的值
方法是在企业管理器中找到上面建立的临时表Products _temp,单击鼠标右键,选择所有任务,选择管理索引,选择新建。如图2所示。
按照图2中圈出来的地方设置索引选项。
第三板斧——拷贝产品信息到临时表insert into Products_temp Select * from Products
此时SQL Server会返回如下提示:
服务器: 消息 3604,级别 16,状态 1,行 1
已忽略重复的键。
它表明在产品信息临时表Products_temp中不会有重复的行出现。
第四板斧——将新的数据导入原表
将原产品信息表Products清空,并将临时表Products_temp中数据导入,最后删除临时表Products_temp。delete Products
insert into Products select * from Products_temp
drop table Products_temp
这样就完成了对表中重复记录的删除。无论表有多大,它的执行速度都是相当快的,而且因为几乎不用写语句,所以它也是很安全的。
小提示:上述方法中删除重复记录取决于创建唯一索引时选择的字段,在实际的操作过程中读者务必首先确认创建的唯一索引字段是否正确,以免将有用的数据删除。如果记录完全相同才算重复记录,那么: (sql server2000下测试通过)
select distinct * into #tmpp from tid
delete from tid
insert into tid select * from #tmpp
drop table #tmpp如果有id主键(数字,自增1的那种),那么:(sql server2000下测试通过)
delete from tableA where id not in
(select id = min(id) from tableA group by name) -
快速删除重复记录,SQL Server如何实现
2007-12-20 11:19:00如果一张表的数据达到上百万条,用游标的方法来删除简直是个噩梦,因为它会执行相当长的一段时间…… 开发人员的噩梦——删除重复记录 想必每一位开发人员都有过类似... 在SQL Server中除了对拥有十几条记录的表进行人 -
SQL Server: 删除 XML 字段的某个节点
2015-10-13 15:59:51针对于 SQL Server 中的 XML 列,如何删除其中的一个 XML 节点呢?这里有两种方法。 方法1 直接通过SQL语句将目标节点设置为 null即可,直截了当,非常容易。 方法2 如下,查询后进行修改(相关操作我封装成了一个... -
快速删除重复记录,SQL Server如何实现?
2010-01-28 15:59:35一般实现删除重复记录可以写一段代码,用游标遍历,从而删除记录,但如果记录条数比较多,用游标的方法删除需要执行非常长的时间,我试过,数据量不是很多,但是效率很低,结果不是很理想! 现在给大家推荐简便... -
在SQL Server中快速删除重复记录
2017-07-31 15:49:55前几天看了一下赛迪网中的SQL板块的文章,讲了如何在SQL Server中快速删除重复记录。我浏览了一下,作者用了四种方法,有建临时表的,用游标的,用唯一索引的,真可谓穷尽其法。然后我BAIDU了一下,才发现原来我用的... -
深入解析SQL Server 2008(微软SQL Server开发团队必读之作)--随书源代码
2013-02-06 14:13:17运行dbcc时,sqlserver在内部检查什么 处理多个并发用户时,如何在5个隔离级别和2个并发模型中做出选择 作译者 Kalen Delanev自1993年起就是微软SQL Server的MVP,她为全世界的客户提供高级SQL Server培训、... -
SQL Server 2008实战(SQL Server程序员和DBA不可或缺的权威参考手册)--详细书签版
2013-02-06 11:52:19SQL Server 2008实战(SQL Server程序员和DBA不可或缺的权威参考手册) 基本信息 原书名: SQL Server 2008 Transact-SQL Recipes: A Problem-Solution Approach 原出版社: Apress 作者: (美)Joseph Sack 译者: 金... -
SQL Server 2008宝典--详细书签版(第1/2部分)
2013-02-06 13:11:30第2部分为SQLServer 2008的准备篇,介绍了SQL Server 2008的功能、特性、各版本的比较、安装方法、SQL Server 2008的服务、客户端的工具等;第3部分为SQL Server 2008的基本操作篇,介绍如何管理与配置SQL Server ... -
深入解析SQL SERVER 2008(附源代码)
2014-10-20 09:50:20运行dbcc时,sqlserver在内部检查什么 处理多个并发用户时,如何在5个隔离级别和2个并发模型中做出选择 作译者 Kalen Delanev自1993年起就是微软SQL Server的MVP,她为全世界的客户提供高级SQL Server培训、... -
SQL Server 2008高级程序设计 5/6
2012-03-03 19:33:14本书首先介绍SQL Server 2008的新功能,然后在更详实的示例代码的引导下全面深入地展开论述,讨论了如何编写复杂查询、构建各种数据结构以及提高应用程序性能,还讲述了如何管理高级脚本和数据库以及如何确定和... -
SQLSERVER中统计所有表的记录数
2014-11-19 10:01:51今天群里的一个朋友问了个... 首先通过sysobjects表构造一个sql语句字符串'DELETE 表名',其中表名就是sysobjects中的name列,把这些DELETE语句字符串连接起来的方法一是通过游标,二则是直接利用如下语句: selec