对触发器的思考
读到周洲同学的博客,看到一篇关于触发器的文章,是在用户充值时,需要在t_reCharge表中插入一条记录,同时更新t_card表以保证数据一致性.我们当时没想特别多,没想到触发器,就是写了多条sql语句,为了不出错后来使用了事务或存储过程,没记错的话是放在存储过程里
读到周洲同学的博客,看到一篇关于触发器的文章,是在用户充值时,需要在t_reCharge表中插入一条记录,同时更新t_card表以保证数据一致性.我们当时没想特别多,没想到触发器,就是写了多条sql语句,为了不出错后来使用了事务或存储过程,没记错的话是放在存储过程里了。她是这么实现的:
"recharge表中保证提取的是最新一条充值记录,card表中保证更新的记录满足卡号等于充值卡号。"
<spanstyle="font-family:FangSong_GB2312;">CREATETRIGGER[dbo].[CardCash] on [dbo].[T_Recharge] for Insert AS BEGIN UPDATE T_Card set sCash =sCash +(select top 1 rAdd fromT_Recharge order by rNo desc) WhereT_Card .cNo in (select top 1 cNo fromT_Recharge order by rNo desc ) END</span>
原文链接如下:
给D层减负-存储过程与触发器的使用
看到这儿,心里挺佩服小师妹的,不过我还有两个问题:
1. sql语句是硬伤,我可不可以传参呢?
2. 如果有两个卡同时充值,会不会查询到的t_reCharge最新记录是另一个卡的?换句话说,update和insert孰先孰后?其实我一直也没想明白两个卡同时充值到底先插入哪条记录?
3. 如果2中的触发器本身就是事务,保证了要么都执行要么都不执行,就没有这个问题.否则,是不是考虑加上事务呢?
接下来进一步了解了触发器的工作原理。
由于使表中数据发生变化的操作有插入、更新和删除,所以触发器可以分为三类:INSERT触发器、UPDATE触发器和DELETE触发器。
1.INSERT触发器
当试图向表中插入记录时,INSERT触发器(如果有)自动执行,此时系统自动创建一个inserted表,新的记录被添加到触发器表和inserted表。触发器可以检查inserted表,确定是否执行触发器动作和如何执行触发器动作。
2.DELETE触发器
当试图从表中删除信息时,DELETE触发器被触发,此时系统自动创建一个deleted表,被删除的行被放置到这个特殊的表中。被删除的行在触发器表中将不再存在。因此,触发器表和deleted表之间没有共同的记录。
3.UPDATE触发器
UPDATE语句可以看成两步,删除一条旧记录,插入一条新记录。所以,UPDATE触发器被触发时,自动创建一个deleted表和一个inserted表,UPDATE语句使原始行移入deleted表,将更新行插入到inserted表中。
我们这里是一个insert触发器,那为什么用触发器?用一个类似的例子来解释。我们有两个表用来记录商品的出库入库情况,t_good_store记录库存的产品类别和数量,而t_good_out记录出库的产品类别和数量,那么每当我们出库的某个类别的产品一定数量的时候,我们应该在t_good_out中插入该产品的类别和出库数量,同时也应该在t_good_store中用update来更新库存的相应类别的产品的数量;这时我们要完成两个任务:插入t_good_out后更新t_good_store,为避免只操作其中一个而造成数据的不一致,我们可以用触发器,在t_good_out的插入操作上绑定一个对t_good_store更新的触发器。当然这个过程应该是一个事务,这就不必担心插入t_good_out表执行了,而绑定在这个动作上的触发器操作不会执行,因为数据库设计了原子性。
再来看上面的三个问题.
1. 触发器只有在修改(包括插入和删除)时触发,目的是给我们一个做其他动作的机会,它没有在查询数据时做其他动作的能力.问了触发器是否有参数这个问题,说明我刚开始没有理解触发器的这个特性.
另外,根据触发器的工作原理,我们可以访问inserted和deleted这两张临时表,需要明白的是inserted存放进行insert和update操作后的数据;deleted存放进行delete和update操作前的数据.
Update=delete+insert.这一点给我们的启示:DRP系统中有一个页面是修改Item或者client或者flowCard,可以先都删除再都插入,然后提示修改成功,不然那个样子多的条目,如何一条条判断再modify?
2. 关于同时插入两个记录,有人说可以,因为insert是在毫秒级,但是不管什么级都是有先有后啊.又说,insert是rowlevel锁,如果不Lock table的话,也无法确定先后啊.
3. 我认为可以不加事务,触发器要是设计得insert和update之间还可以容得下其他操作,那就没有什么意义了.
我先实验一把,这个空当,就算抛砖引玉了,当然也会默默地、虚心地接受板砖…

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











iOS17 및 iPadOS17에서 Apple은 iPhone 및 iPad에 메시지와 유사한 FaceTime 반응을 도입했습니다. 메뉴에서 아이콘을 선택하는 대신 FaceTime 통화 중에 물리적인 동작으로 아이콘을 실행할 수 있습니다. iOS 17을 실행하는 iPhone 또는 iPadOS 17을 실행하는 iPad에서 FaceTime 영상 통화를 걸면 하트, 풍선, 색종이 조각, 불꽃놀이 등과 같은 화면 효과를 실행할 수 있습니다. 시각 효과는 FaceTime 통화 영상의 디스플레이를 채웁니다. 때로는 다른 사람들이 보기에도 장관입니다. 당신은 핸즈프리이며 신체적인 제스처만을 사용하여 이러한 반응을 유발할 수 있습니다. 예를 들어 엄지손가락을 치켜세우세요

Flask를 설치하는 방법과 개인 블로그를 빠르게 구축하는 방법을 처음부터 차근차근 가르쳐드리겠습니다. 글쓰기를 좋아하는 사람으로서 개인 블로그를 갖는 것은 매우 중요합니다. 경량 Python 웹 프레임워크인 Flask를 사용하면 간단하고 완전한 기능을 갖춘 개인 블로그를 빠르게 구축할 수 있습니다. 이 기사에서는 처음부터 시작하여 Flask를 설치하고 개인 블로그를 빠르게 구축하는 방법을 단계별로 가르쳐 드리겠습니다. 1단계: Python 및 pip 설치 시작하기 전에 먼저 Python 및 pi를 설치해야 합니다.

macOS Sonoma에서 Apple은 FaceTime에 대한 메시지와 같은 반응을 도입했습니다. 그러나 텍스트로 실행되는 대신 제스처로 실행될 수도 있습니다. macOS Sonoma 및 이후 버전을 실행하는 Mac에서 FaceTime 영상 통화를 할 때 하트, 풍선, 색종이 조각, 불꽃놀이 등과 같은 화면 효과를 실행하여 FaceTime 통화 창에 화면을 가득 채울 수 있습니다. 미니 웹캠 보기와 반응을 유발하는 버튼이 포함된 녹색 FaceTime 메뉴 표시줄 항목을 통해 이러한 레이어 화면 효과를 유발하거나, 핸즈프리로 이동하여 물리적 제스처만으로 동일한 반응을 유발할 수 있습니다. 예를 들어, 엄지손가락을 치켜세우면 좋아요, 두 개가 표시됩니다.

PowerPoint에서 클릭하기 전에 텍스트를 숨기는 방법 PowerPoint 슬라이드의 아무 곳이나 클릭할 때 텍스트가 나타나도록 하려면 설정이 빠르고 쉽습니다. PowerPoint에서 버튼을 클릭하기 전에 텍스트를 숨기려면: PowerPoint 문서를 열고 삽입 메뉴를 클릭하세요. 새 슬라이드를 클릭하세요. 공백 또는 다른 사전 설정 중 하나를 선택합니다. 삽입 메뉴에서 텍스트 상자를 클릭합니다. 텍스트 상자를 슬라이드로 드래그합니다. 텍스트 상자를 클릭하고 원하는 내용을 입력하세요.

웹 로그, 블로그, 블로그라고도 번역되는 블로그는 일반적으로 개인이 관리하고 수시로 새로운 기사를 게시하는 웹 사이트입니다. 그렇다면 블로그를 설정하는 방법은 무엇입니까? PHP 블로그 시스템이란 무엇입니까? 어떤 블로깅 시스템을 사용하는 것이 가장 좋습니까? 아래 PHP 중국어 웹사이트에서는 상위 10개 오픈 소스 PHP 블로그 시스템을 요약하고 공유합니다.

인터넷의 발달로 블로그는 점점 더 많은 사람들이 자신의 삶과 지식, 아이디어를 공유하는 플랫폼이 되었습니다. 자신만의 블로그를 만들고 싶다면 이 기사에서는 PHP와 SQLite를 사용하여 간단한 블로그를 만드는 방법을 소개합니다. 요구 사항 결정 블로그 만들기를 시작하기 전에 달성하려는 기능을 결정해야 합니다. 예: 블로그 게시물 작성 블로그 게시물 편집 블로그 게시물 삭제 블로그 게시물 목록 표시 블로그 게시물 세부 정보 표시 사용자 인증 및 권한 제어 PHP 및 SQLite 설치 PHP 및 S를 설치해야 합니다.

이벤트 버블링이 두 번 트리거되는 이유는 무엇입니까? 이벤트 버블링(이벤트 버블링)은 DOM에서 요소가 이벤트(예: 클릭 이벤트)를 트리거할 때 이벤트가 최상위 문서 객체에 버블링될 때까지 요소에서 상위 요소로 버블링되는 것을 의미합니다. 이벤트 버블링은 DOM 이벤트 모델의 일부입니다. 이를 통해 개발자는 이벤트 리스너를 상위 요소에 바인딩할 수 있으므로 하위 요소가 이벤트를 트리거할 때 이벤트가 버블링 메커니즘을 통해 캡처되고 처리될 수 있습니다. 그러나 때때로 개발자는 버블링되어 두 번 트리거되는 이벤트를 접하게 됩니다.

iOS17에서 Apple은 FaceTime에 메시지와 같은 반응을 도입했습니다. 그러나 텍스트로 실행되는 대신 제스처로 실행될 수도 있습니다. iOS 17을 실행하는 iPhone에서 FaceTime 영상 통화를 할 때 이제 하트, 풍선, 색종이 조각, 불꽃놀이 등과 같은 화면 효과를 실행하여 FaceTime 통화 창 위로 디스플레이를 가득 채울 수 있습니다. FaceTime에서 사진을 길게 누르면 반응 옵션 메뉴가 표시되어 이러한 레이어 화면 효과를 실행할 수 있습니다. 또는 핸즈프리로 이동하여 물리적인 제스처만으로 동일한 반응을 실행할 수도 있습니다. 예를 들어 엄지손가락 하나를 올리면 '좋아요'가 트리거되고 엄지손가락 두 개를 올리면 불꽃놀이가 됩니다. 마찬가지로, 싫어요도 포함되지 않습니다.
