应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

SQLSERVER居然也能调C代码?

  一:背景1。讲故事
  前些天看到一个奇怪的Function函数,调用的是C链接库中的一个UserLogin方法,参考代码如下:CREATEFUNCTIONdbo。clrUserLogin(nameASNVARCHAR(100),passwordASNVARCHAR(100))RETURNSINTASEXTERNALNAMEasmXXX。〔xxx。CLRFunctions〕。UserLogin;GO
  这就让我产生了很大的兴趣,众所周知SQLSERVER是C写的,那这里的C怎么和C打通呢?而且C是一门托管语言,需要JIT将其native化,这个JIT又在哪里呢?带着这些疑问一起研究下吧。二:互通原理研究1。一个简单的例子
  首先写一段简单的C代码,然后把它编译成dll。namespaceAQMN。Bussiness{publicclassUserFunctions{publicstaticstringUserLogin(stringusername,stringpassword){varrandomnewRandom();varisSuccessrandom。Next()20;returnisSuccess?登录成功:登录失败;}}}
  接下来需要做的就是数据库参数配置,开启CLR支持,并且指定某个数据库支持unsafe模式。EXECspconfigureclrenabled,1;RECONFIGURE;GOALTERDATABASEMyTestDBSETTRUSTWORTHYON;GO
  为了能够调到C的UserLogin方法,需要SQLSERVER先导入这个程序集,然后再以Function映射其中方法即可,参考代码如下:CREATEASSEMBLYclrAQMNBussinessFROMD:et6SQLCrawlAQMN。BussinessbinDebugAQMN。Bussiness。dllWITHPERMISSIONSETUNSAFE;GOCREATEFUNCTIONdbo。clrUserLogin(usernameASNVARCHAR(100),passwordASNVARCHAR(100))RETURNSNVARCHAR(100)ASEXTERNALNAMEclrAQMNBussiness。〔AQMN。Bussiness。UserFunctions〕。UserLogin;GO
  创建完了之后,可以观察assembly开头的几个系统视图。SELECTFROMsys。assembliesSELECTFROMsys。assemblyfiles;SELECTFROMsys。assemblymodules;
  看起来没啥问题,接下来调用一下刚才创建的clrUserLogin函数。SELECTdbo。clrUserLogin(Njack,N123456)ASStateGO10
  从图中看登录结果是随机的,说明C的Random函数起到了作用,非常有意思。2。WinDbg观察
  从案例的运行结果看,推测在SQLSERVER中应该承载了一个CLR运行环境,那是不是这样呢?可以用WinDbg附加到sqlservr。exe进程,用lm观察下模块加载情况。0:092lmstartendmodulename。。。00007ff8d396000000007ff8d3aaf000clrjit(deferred)00007ff8de04000000007ff8deb02000clr(deferred)。。。0:092!eeversion4。8。4300。0freeServermodewith12gcheapsSOSVersion:4。8。4300。0retailbuild
  从输出看果然加载了clr和clrjit动态链接库,当前还是gcserver模式,哈。
  接下来再验证一个问题,既然clrUserLogin函数会显示登录成功登录失败,那必然会调用C的UserLogin方法,可以在WinDbg中对UserLogin方法下一个断点观察一下这个调用过程。0:090!name2eeAQMN。Bussiness!AQMN。Bussiness。UserFunctions。UserLoginModule:00007ff87ee37988Assembly:AQMN。Bussiness,Version1。0。0。0,Cultureneutral,PublicKeyTokennullToken:0000000006000001MethodDesc:00007ff87ee38020Name:AQMN。Bussiness。UserFunctions。UserLogin(System。String,System。String)JITTEDCodeAddress:00007ff87ec560d00:090bp00007ff87ec560d00:090g
  从输出信息看UserLogin方法已经被JIT过了,用bp下完断点之后,继续g,然后在SSMS上再次执行查询就可以成功命中啦。0:090kChildSPRetAddrCallSite00000000df1557ae4800007ff87ee500b60x00007ff87ec560d001000000df1557ae5000007ff87ec55ef10x00007ff87ee500b602000000df1557aeb000007ff8de04222e0x00007ff87ec55ef103000000df1557af0000007ff8a2b79ff3clr!UMThunkStub0x6e04000000df1557af9000007ff8a2b741bdsqllang!CallProtectorImpl::CallWithSEHconst0x2305000000df1557afc000007ff8a2b6bfc4sqllang!CallProtectorImpl::CallExternalFullconst0x2dd06000000df1557b13000007ff8a2bda602sqllang!CAppDomain::InvokeClrFn0xd407000000df1557b1d000007ff8aef51ee7sqllang!UDFInvokeExternalImpl0xb7208000000df1557b7e000007ff89de52e24sqlTsEs!CEsExec::GeneralEval40xe709000000df1557b8b000007ff89de52d64sqlmin!CQScanProjectNew::EvalExprs0x18f0a000000df1557b92000007ff89ddd8759sqlmin!CQScanProjectNew::GetRow0x980b000000df1557b97000007ff89ddc73desqlmin!CQScanLightProfileNew::GetRow0x190c000000df1557b9a000007ff8a25e51d7sqlmin!CQueryScan::GetRow0x800d000000df1557b9d000007ff8a32a78b2sqllang!CXStmtQuery::ErsqExecuteQuery0x3d80e000000df1557bb4000007ff8a2bc2451sqllang!CXStmtSelect::XretDoExecute0x3420f000000df1557bc1000007ff8a2b733d3sqllang!UMLoopbackForStatementExecution0x19110000000df1557bd0000007ff8de48e940sqllang!AppDomainCallbackFunctionCallBinder5void,void(cdecl)(CXStmtQueryptr64,CCompExecCtxtStmtconstptr64,CMsqlExecContextptr64,unsignedlongptr64,enumESqlReturnCodeptr64),CXStmtQueryptr64,CCompExecCtxtStmtconstptr64,CMsqlExecContextptr64,unsignedlongptr64,enumESqlReturnCodeptr640x2311000000df1557bd4000007ff8de48e193clr!ExecuteInAppDomainHelper0x4012000000df1557bd8000007ff8a2b79f39clr!CorHost2::ExecuteInAppDomain0x3a013000000df1557c0a000007ff8a2b73a86sqllang!CallProtectorImpl::CallWithSEH0x2914000000df1557c0d000007ff8a2b6c2d0sqllang!CallProtectorImpl::CallExternalFull0x18615000000df1557c17000007ff8a32a72f4sqllang!CAppDomain::LoopbackForStatementExecution0x18016000000df1557c23000007ff8a32a79adsqllang!CXStmtQuery::XretCLRExecute0x10417000000df1557c2a000007ff8a25e4a65sqllang!CXStmtSelect::XretExecute0x4a18000000df1557c37000007ff8a25e44a8sqllang!CMsqlExecContext::ExecuteStmts1,10x8f219000000df1557cf1000007ff8a25e3a2csqllang!CMsqlExecContext::FExecute0x9361a000000df1557def000007ff8a25ee67bsqllang!CSQLSource::Execute0xc5c1b000000df1557e3d000007ff8a25ed815sqllang!processrequest0xca61c000000df1557ead000007ff8a25ed5efsqllang!processcommandsinternal0x4b71d000000df1557ec0000007ff8b1e46523sqllang!processmessages0x1d61e000000df1557ede000007ff8b1e46e6dsqldk!SOSTask::Param::Execute0x2321f000000df1557f3e000007ff8b1e46c75sqldk!SOSScheduler::RunTask0xa520000000df1557f45000007ff8b1e6b160sqldk!SOSScheduler::ProcessTasks0x39d21000000df1557f57000007ff8b1e6aa5bsqldk!SchedulerManager::WorkerEntryPoint0x2a122000000df1557f64000007ff8b1e6afa4sqldk!SystemThreadDispatcher::ProcessWorker0x3ed23000000df1557f94000007ff8f6d86fd4sqldk!SchedulerManager::ThreadEntryPoint0x3b524000000df1557fa3000007ff8f865cec1KERNEL32!BaseThreadInitThunk0x1425000000df1557fa600000000000000000ntdll!RtlUserThreadStart0x21
  果然是一个request请求,然后达到了托管方法UserLogin,顶部的三行线程栈可以用!clrstack具意下。0:090!clrstackOSThreadId:0x6df4(90)ChildSPIPCallSite000000df1557ae4800007ff87ec560d0AQMN。Bussiness。UserFunctions。UserLogin(System。String,System。String)000000df1557ae5000007ff87ee500b6DynamicClass。SQLCLREval(IntPtr,IntPtr,IntPtr)000000df1557aeb000007ff87ec55ef1DomainBoundILStubClass。ILSTUBReversePInvoke(Int64,Int64,Int64)000000df1557bf1800007ff8de04222e〔ContextTransitionFrame:000000df1557bf18〕三:总结
  SQLSERVER内嵌了CLR,让sqlservr进程成了一种托管和非托管的混合环境,不知道是好事还是坏事,在我的分析旅程中这种混合环境下看过太多的堆破坏问题,但不管怎么说,托管的C,VB,F可以助SQLSERVER更加强大。

春节家宴聚餐,推荐6热4凉1汤,荤素冷热合理搭配,家人太满意距离春节的时间越来越近了,春节辞旧迎新,代表着这一年的结束,新的一年的开始。春节还意味着团圆,在外工作的家人们不远千里回到家里,与自己父母和兄弟姐妹团圆,那么春节家宴吃什么好呢……芳眼看世界江南水乡新生活,黎里真是很好逛!江南美,处处画雨烟。在岁月的低吟浅唱中,一泓清泉淌过长巷曲街,串起座座古镇,勾勒出秀丽水乡。黎里,一个很有诗意的名字,曾经也叫黎川梨花里禊湖,悠悠黎川至今依然流淌着原色的水乡生……碧桂园,五五开冷眼看财报本文收录于专辑冷眼看财报虽然对行业面临的困难有预期和准备,但市场下行的深度及广度还是超出了我们的预期。与半年前的中报业绩会相似,碧桂园2022年全年业绩会上,总裁莫斌开场……在民间最诚恳的饭店里,没点本事都不敢点菜中华饮食向来拥有相当多元的历史走向,没人敢说自己完全掌握了其中奥秘。在广阔的民间餐饮体系里,很难说发生过多少开宗立派的壮举,有时你走进一家饭店,就已经有机会打破惯性思维的……中国经济可持续增长目标有益于全世界中国日报网3月25日电中国国际经济交流中心副理事长、国际货币基金组织前副总裁朱民表示,中国今年国内生产总值(GDP)增长5左右的预期目标是一个审慎和可持续的选择,在全球金融不稳……红到你心里!2023青岛网红打卡地发布大众网海报新闻记者谭文凯青岛报道全城皆胜景,春光正当时。3月25日,2023青岛网红打卡地发布仪式在奥帆中心情人坝举行。100个青岛网红打卡地正式与大家见面。百大网……除了超然楼,济南这些名楼也可登临来源:【爱济南新闻客户端】还有人没听说过超然楼吗?春节长假之后,济南市大明湖东岸的江北第一楼超然楼一夜之间成为了网红,超然楼亮灯成为最吸引游人的出圈景观。其实……浦发银行2022年净利润512亿元【大河财立方消息】3月22日,浦发银行发布2022年度业绩快报。浦发银行2022年实现营业收入1886。22亿元,同比减少23。60亿元,下降1。24;归属于母公司股东的净利润……加力提效实施积极财政政策面对外部环境不确定性加大、经济恢复基础尚不牢固的现状,今年《政府工作报告》提出,要坚持稳字当头、稳中求进,保持政策连续性针对性,加强各类政策协调配合,形成共促高质量发展合力。从……门票定了!成人80元每位,儿童免费,火爆网络的梦溪苑今天开票来源:【看余杭】几天前,看余杭客户端推送了一条梦溪苑开园刚刚官宣,即将对外开放!余杭这座宋式园林99的人还不知道去看看让很多人对这个绝美的私家园林长草!……鼓励多生孩子的好建议,为啥遭到批评?背后有哪些争议?看点!鼓励多生孩子遭受的抨击,和学雷锋高大形象背后的争议大家好!本文源自微信公号《攀岩的时代》。看到这个标题,有人也许会喷,你真能掰扯!生孩子和学雷锋能扯上关系吗?……国外芯片厂商,生产和供货最新的信息国外芯片厂商最新动态:ON(安森美):部分芯片交期超过70周ON2022年营收达83亿美元,创历史记录。在两年多的行情中,ON的整体需求相对旺盛,是典型的闷声……
南理工JMST首次制备这种非晶合金!原位研究多形性相变过程非晶合金具有复杂的局部有序结构,但是由于人们对非晶深层结构认知的不完备以及表征手段的限制,通过传统快速冷却方法制备的非晶合金往往难以实现结构调控。自1989年HerbertGl……高通联发科芯片爆发漏洞,安卓手机几乎全中招Android手机爆发最新安全漏洞,根据《CheckPoint》最新研究发现,黑客会根据苹果研发的老旧的音乐编码格式,远端操控手机,全球超过三分之二的Android手机都恐遭殃……太刺激!前国乒选手投韩,已拿亚运会世锦赛资格,反戈国乒争金海外兵团,是中国乒乓球选手出走海外,代表外协参加比赛,对推广乒乓球运动,起到了积极作用,成为乒乓赛场靓丽风景。像早期的何智丽、陈静,现役的韩莹、田志希等,都曾代表外协,在……一刀下来砍成狗?首台F系9金坦克CharMle。75大改3B怪东西又改了各位车长老爷们大家好啊。此前我为大家做过超测前瞻的F系首台9级金币坦克CharMle。75一经推出后引发了许多争议,也许是WG自己都觉得设计的太奇葩了,于是对……英超2莱斯特城取两连胜热苏斯2球2助攻扎卡破门北京时间8月13日晚22点,202223赛季英超联赛第2轮迎来一场焦点战,阿森纳坐镇酋长球场迎战莱斯特城。上半场,枪手新援热苏斯梅开二度;下半场,他又先后助攻扎卡和马丁内利破门……从中国产品到中国品牌,看中国男士皮鞋品牌崛起的底气近日,中研产业研究院公布《20222027年中国皮鞋行业深度调研及投资前景预测研究报告》。报告显示,从20202021年皮鞋行业运行情况来看,行业销售收入有所增加。其中,202……我国成功发射一箭十六星新华社发(郑斌摄)昨天12时50分,我国在太原卫星发射中心使用长征六号遥十运载火箭,成功将吉林一号高分03D09星、云遥一号0408星等16颗卫星发射升空,卫星顺利进入预……北京冬奥会刚闭幕,剑网三玩家就坐不住了,又想要官方安排新道具就在近日,北京冬奥会在国家体育场鸟巢完美落幕,伴随着《送别》的歌声,来自全世界91个国家及地区的参赛人员正式与北京道别,与冰墩墩告别。而除了不舍的气氛之外,在闭幕式上,有……盐吃多,危害大!但是你每天吃的盐都能超标1。五味之一咸为盐,化学则用钠称赞,每日摄入6克够,多吃对人有危害。食盐会使血压高,血管内皮也破坏,防治心脑血管病,饮食要把盐来限。2。心脑血管疾病是威胁人类生命和健康的……SanagM11深度体验,现场级音乐展现,149元的全能低音每天下班,回到一个人的房间,便会卸下所有装备和疲惫,懒懒地窝在沙发上,用音乐让自己好好放松一下,这时候,不喜欢戴耳机,毕竟只有一个人,喜欢把手机音量调大,但听得时间久了,总觉得……身材臃肿,39岁瓦妮莎被质疑怀孕,体重200斤该减肥了因为身材臃肿,39岁的科比遗孀瓦妮莎被美国八卦媒体质疑怀孕。该媒体表示,出现在全明星赛上的瓦妮莎身材臃肿,比NBA球员还魁梧,特别是肚子,大腹便便,一看就是身怀六甲的样子。……蔡斌斩草除根!郎平3名大将被清洗,朱婷张常宁无缘国家集训队在东京奥运会失利以后,主教练郎平卸任,中国女排进入了相当长时间的混乱期,处于长时间群龙无首的情况,好在2月初的时候蔡斌通过竞选上任中国女排主教练。蔡斌上任以后不少球迷有些……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网