仓酷云

标题: MYSQL编程:完成删除主表数据时, 判别与之联系关系的外... [打印本页]

作者: 灵魂腐蚀    时间: 2015-1-16 22:19
标题: MYSQL编程:完成删除主表数据时, 判别与之联系关系的外...
据我的观察,现在有一个趋势,那些经过正式培训的数据库管理员DBA更倾向于选择一个专有关系数据库,例如Oracle。对于一些具有专门数据库管理员的比较大的环境来说,MySQL很难得到宠爱,这时候,关于MySQL是否真的具有良好的可扩展性的争论已经没有意义。成绩形貌:某个基本信息表,与体系中30多个表存在外键干系,当删除基本数据时,必要判别是不是已被用过,假如用过则变动标记位,假如没有效过则间接删除,怎样能很好完成这个处置?最好可以主动顺应表的变更成绩办理(SQLServer2005--SQLServer2005的毛病处置简单把持,因而,SQLServer2005中能够间接删除,经由过程毛病处置来断定是不是必要更新.--示比方下.USEtempdbGOCREATETABLEm(idintPRIMARYKEY,bzbit)INSERTmSELECT1,0UNIONALLSELECT2,0CREATETABLEc(idintprimarykey,a_idintreferencesm(id)ONDELETENOACTION)INSERTcSELECT1,1GO--删除处置存储历程CREATEPROCdbo.p_delete@idintASSETNOCOUNTONBEGINTRYBEGINTRANDELETEFROMmWHEREid=@idCOMMITTRANENDTRYBEGINCATCHROLLBACKTRANIFERROR_NUMBER()=547--假如是外键束缚毛病BEGINBEGINTRYBEGINTRAN--更新标记UPDATEmSETbz=1WHEREid=@idCOMMITTRANENDTRYBEGINCATCHSELECTERROR_NUMBER(),ERROR_MESSAGE()ENDCATCHENDELSESELECTERROR_NUMBER(),ERROR_MESSAGE()ENDCATCHGO--挪用EXECdbo.p_delete1EXECdbo.p_delete2SELECT*FROMmSELECT*FROMcGODROPTABLEc,mDROPPROCdbo.p_delete成绩办理(SQLServer2000--SQLServer2000对毛病处置欠好把持,一样平常仍是倡议做判别--经由过程体系表查询体系表,能够猎取某个表联系关系的一切外键表--示例存储历程CREATEPROCdbo.p_Delete@tbnamesysname,--基本数据表名@PkFieldNamesysname,--基本数据表关头字段名@PkValueint--要删除的基本数据表关头字值ASSETNOCOUNTONDECLARE@bzbit,@snvarchar(4000)DECLAREtbCURSORLOCALFORSELECTNSET@bz=CASEWHENEXISTS(SELECT*FROM+QUOTENAME(@tbname)+NA,+QUOTENAME(OBJECT_NAME(B.fkeyid))+NBWHEREA.+QUOTENAME((SELECTnameFROMsyscolumnsWHEREcolid=B.rkeyANDid=B.rkeyid))+N=B.+QUOTENAME((SELECTnameFROMsyscolumnsWHEREcolid=B.fkeyANDid=B.fkeyid))+NANDA.+QUOTENAME((SELECTnameFROMsyscolumnsWHEREcolid=B.rkeyANDid=B.rkeyid))+N=@id)THEN1ELSE0ENDFROMsysobjectsAJOINsysforeignkeysBONA.id=B.constidJOINsysobjectsCONA.parent_obj=C.idWHEREA.xtype=fANDC.xtype=UANDOBJECT_NAME(B.rkeyid)=@tbnameOPENtbFETCHtbINTO@sWHILE@@FETCH_STATUS=0BEGINEXECsp_executesql@s,N@tbnamesysname,@idint,@bzbitOUT,@tbname,@PkValue,@bzOUTIF@bz=1BEGINSET@s=NUPDATE+QUOTENAME(@tbname)+NSETbz=1WHERE+QUOTENAME(@PkFieldName)+N=@idEXECsp_executesql@s,N@idint,@PkValueRETURNENDFETCHtbINTO@sENDCLOSEtbDEALLOCATEtbSET@s=NDELETEFROM+QUOTENAME(@tbname)+NWHERE+QUOTENAME(@PkFieldName)+N=@idEXECsp_executesql@s,N@idint,@PkValueGO注重事项设置表的主/外键干系的时分,不要设置级联删除(ONDELETECASCADE)

一些典型的RDBMS功能并不总是在DBaaS系统中可用。例如MySQL学习教程,WindowsAzureSQLDatabase(以前的SQLAzure)是微软的DBaaS产品,提供了一个类似于SQLServer的数据库平台。
作者: 乐观    时间: 2015-1-19 08:42
sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西
作者: admin    时间: 2015-1-24 14:19
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
作者: 透明    时间: 2015-2-1 16:52
同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。
作者: 海妖    时间: 2015-2-7 10:07
原来公司用过MYSQL自己也只是建个表写个SQL
作者: 分手快乐    时间: 2015-2-21 17:40
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
作者: 山那边是海    时间: 2015-3-6 20:59
我们学到了什么?思考问题的时候从表的角度来思考问
作者: 第二个灵魂    时间: 2015-3-13 09:10
每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。
作者: 冷月葬花魂    时间: 2015-3-20 18:53
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2