null

本文探讨了使用C风格字符串时的常见错误,如忘记添加null终止符可能导致的字符串长度计算错误,以及使用strcat和strcpy可能引发的安全问题。推荐使用strncat和strncpy等函数来提高安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用处理C风格字符串的标准库函数时,牢记字符串必须以结束符null结束。

char ca[]  =  { 'C' ,'+' , '+' };      cout  << strlen(ca)  <<endl;     //ca中没有null结束符,计算结果不可预料

对没有null结束符的字符数组,则strlen计算的结果不可预料。

标准库函数strlen总是假定其参数字符串以null字符结束,当调用该标准库函数,系统将会从实参指向的内存空间开始一直搜索结束符,直到恰好遇到null为止。strlen返回这一段内存空间中总共有多少个字符,无论如何这个数值不可能时正确的。


传递给标准库函数strcat ,strcpy的第一个实参数组必须具有足够大的空间存放新生成的字符串。

如果第二个字符串大小发生变化,程序容易出错,导致严重的安全漏洞。

如果必须使用C风格字符串,则使用标准库函数strncat 和strncpy比strcat和 strcpy函数更安全。

在复制和串连字符串时,一定要时刻记住算上结束符null,在定义字符串时要切记预留存放null字符的空间。

标准库函数strlen用于计算C风格字符串中的字符个数,不包括null结束符。

如果使用C++标准库类型string,则不存在数组溢出和截短字符串,标准库则处理所有的内存管理问题。不必担心每次修改字符串时设计到的大小问题。除增强安全性外,效率也提高了。

--DATE:2023-10-27 --CONTENT:KMPLM-6979 新增与优化变更配置项管理和菜单入口 by 薛启宽 DECLARE VN INT; BEGIN SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 754; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (754, 750, 'EbomChangeIssue', null, null, 'ECI', 'EBOM问题报告', 'PLM_EbomChangeIssue', '5,7,70,251,750,754', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 755; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (755, 750, 'PbomChangeIssue', null, null, 'PCI', 'PBOM问题报告', 'PLM_PbomChangeIssue', '5,7,70,251,750,755', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 756; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (756, 751, 'EbomChangeRequest', null, null, 'ECR', 'EBOM变更申请', 'PLM_EbomChangeRequest', '5,7,70,251,751,756', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 757; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (757, 751, 'PbomChangeRequest', null, null, 'PCR', 'PBOM变更申请', 'PLM_PbomChangeRequest', '5,7,70,251,751,757', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 758; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (758, 752, 'EbomChangeOrder', null, null, 'ECO', 'EBOM变更指令', 'PLM_EbomChangeOrder', '5,7,70,251,752,758', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 759; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (759, 752, 'PbomChangeOrder', null, null, 'PCO', 'PBOM变更指令', 'PLM_PbomChangeOrder', '5,7,70,251,752,759', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 760; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (760, 753, 'EbomChangeActivity', null, null, 'ECA', 'EBOM变更活动', 'PLM_EbomChangeActivity', '5,7,70,251,753,760', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 3, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 761; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (761, 753, 'PbomChangeActivity', null, null, 'PCA', 'PBOM变更活动', 'PLM_PbomChangeActivity', '5,7,70,251,753,761', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 754; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (754, 750, 'EbomChangeIssue', null, null, 'ECI', 'EBOM问题报告', 'PLM_EbomChangeIssue', '5,7,70,251,750,754', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 755; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (755, 750, 'PbomChangeIssue', null, null, 'PCI', 'PBOM问题报告', 'PLM_PbomChangeIssue', '5,7,70,251,750,755', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 756; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (756, 751, 'EbomChangeRequest', null, null, 'ECR', 'EBOM变更申请', 'PLM_EbomChangeRequest', '5,7,70,251,751,756', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 757; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (757, 751, 'PbomChangeRequest', null, null, 'PCR', 'PBOM变更申请', 'PLM_PbomChangeRequest', '5,7,70,251,751,757', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 758; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (758, 752, 'EbomChangeOrder', null, null, 'ECO', 'EBOM变更指令', 'PLM_EbomChangeOrder', '5,7,70,251,752,758', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 759; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (759, 752, 'PbomChangeOrder', null, null, 'PCO', 'PBOM变更指令', 'PLM_PbomChangeOrder', '5,7,70,251,752,759', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 760; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (760, 753, 'EbomChangeActivity', null, null, 'ECA', 'EBOM变更活动', 'PLM_EbomChangeActivity', '5,7,70,251,753,760', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 3, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 761; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (761, 753, 'PbomChangeActivity', null, null, 'PCA', 'PBOM变更活动', 'PLM_PbomChangeActivity', '5,7,70,251,753,761', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; COMMIT; END; /
最新发布
05-17
### PLM系统中EBOM和PBOM变更管理的表定义及数据初始化 在产品生命周期管理(PLM)系统中,工程物料清单(EBOM, Engineering Bill of Materials)和工艺物料清单(PBOM, Process Bill Of Materials)是核心组成部分。为了支持EBOM和PBOM的变更管理,需要设计一系列数据库表来跟踪变更请求、审批状态、变更历史以及其他相关活动。以下是基于SQL脚本的设计方案。 --- #### 数据库表设计 ##### 1. 变更申请表 (`Change_Request`) 该表用于记录所有的变更请求信息。 ```sql CREATE TABLE Change_Request ( Request_ID INT PRIMARY KEY AUTO_INCREMENT, Title VARCHAR(255) NOT NULL, Description TEXT, Created_By INT NOT NULL REFERENCES User(User_ID), Created_Date DATETIME DEFAULT CURRENT_TIMESTAMP, Status ENUM('Draft', 'Submitted', 'Approved', 'Rejected') DEFAULT 'Draft', BOM_Type ENUM('EBOM', 'PBOM') NOT NULL -- 表明变更涉及 EBOM 或 PBOM ); ``` ##### 2. 变更指令表 (`Change_Order`) 该表用于记录批准后的变更指令及其执行情况。 ```sql CREATE TABLE Change_Order ( Order_ID INT PRIMARY KEY AUTO_INCREMENT, Request_ID INT UNIQUE NOT NULL REFERENCES Change_Request(Request_ID), Issued_By INT NOT NULL REFERENCES User(User_ID), Issued_Date DATETIME DEFAULT CURRENT_TIMESTAMP, Execution_Status ENUM('Pending', 'In Progress', 'Completed') DEFAULT 'Pending' ); ``` ##### 3. 变更活动日志表 (`Change_Activity_Log`) 该表用于记录每次变更的具体操作细节。 ```sql CREATE TABLE Change_Activity_Log ( Log_ID INT PRIMARY KEY AUTO_INCREMENT, Order_ID INT NOT NULL REFERENCES Change_Order(Order_ID), Activity_Description TEXT NOT NULL, Performed_By INT NOT NULL REFERENCES User(User_ID), Perform_Date DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` ##### 4. 物料版本控制表 (`Part_Version_Control`) 该表用于追踪物料的不同版本及其与变更的关系。 ```sql CREATE TABLE Part_Version_Control ( Version_ID INT PRIMARY KEY AUTO_INCREMENT, Part_Number VARCHAR(50) NOT NULL, Version_Number DECIMAL(5, 2) NOT NULL, Effective_Date DATE NOT NULL, Obsolete_Date DATE, Associated_Change_Order INT REFERENCES Change_Order(Order_ID), UNIQUE (Part_Number, Version_Number) ); ``` ##### 5. BOM结构表 (`BOM_Structure`) 该表用于存储当前有效的EBOM/PBOM结构。 ```sql CREATE TABLE BOM_Structure ( Structure_ID INT PRIMARY KEY AUTO_INCREMENT, Parent_Part_Number VARCHAR(50) NOT NULL, Child_Part_Number VARCHAR(50) NOT NULL, Quantity_Per_Parent DECIMAL(10, 3) NOT NULL, BOM_Type ENUM('EBOM', 'PBOM') NOT NULL, Effective_Version INT REFERENCES Part_Version_Control(Version_ID), FOREIGN KEY (Parent_Part_Number) REFERENCES Parts(Part_Number), FOREIGN KEY (Child_Part_Number) REFERENCES Parts(Part_Number) ); ``` ##### 6. 零件基础信息表 (`Parts`) 该表用于存储零件的基础属性。 ```sql CREATE TABLE Parts ( Part_Number VARCHAR(50) PRIMARY KEY, Name VARCHAR(255) NOT NULL, Category VARCHAR(100), Manufacturer VARCHAR(100), Specification TEXT ); ``` --- #### 初始数据加载 以下是一些示例SQL语句,展示如何向上述表格中插入初始数据。 ##### 插入零件基本信息 ```sql INSERT INTO Parts (Part_Number, Name, Category, Manufacturer, Specification) VALUES ('PART001', 'Engine Block', 'Mechanical', 'ABC Corp.', 'High-performance engine block'); ``` ##### 创建一个新的变更请求 ```sql INSERT INTO Change_Request (Title, Description, Created_By, BOM_Type) VALUES ('Update Engine Specifications', 'Modify the specifications of PART001 to support higher RPMs', 101, 'EBOM'); ``` ##### 将变更请求转化为变更指令 ```sql INSERT INTO Change_Order (Request_ID, Issued_By) SELECT Request_ID, 102 FROM Change_Request WHERE Request_ID = 1 AND Status = 'Approved'; ``` ##### 记录变更活动 ```sql INSERT INTO Change_Activity_Log (Order_ID, Activity_Description, Performed_By) VALUES (1, 'Updated specification field for PART001', 103); ``` ##### 更新物料版本 ```sql INSERT INTO Part_Version_Control (Part_Number, Version_Number, Effective_Date, Associated_Change_Order) VALUES ('PART001', 2.0, '2023-09-01', 1); ``` ##### 修改BOM结构 ```sql UPDATE BOM_Structure SET Effective_Version = (SELECT Version_ID FROM Part_Version_Control WHERE Part_Number = 'PART001' AND Version_Number = 2.0) WHERE Child_Part_Number = 'PART001'; ``` --- ### 总结 通过上述表结构设计和SQL脚本,可以有效地管理和追溯EBOM和PBOM的变更过程。这种设计方案不仅涵盖了变更申请、审批、执行的历史记录,还提供了详细的物料版本控制能力[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值