U8数据库开发规范-二次开发

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

U8二次开发数据库开发规范
一、数据库命名规则
1.表、视图、存储过程、用户定义的函数、索引
✧前缀尽量大写;
✧使用英文命名;
✧尽量用完整的词,单词的第一个字母大写;对象的名称应尽量表明具体使用的含义
下表XX 代表对象内容。

2.表、视图等字段命名
表、视图中字段都用英文命名,一般字段命名规则如下:
✧数据类型的简写为小写字母前缀;
✧后面是该字段的名称描述,应尽量表明字段含义、使用完整单词;
如果名称描述多个单词组成,每个单词的第一个字母都大写
✧具有特殊含义的后缀结尾。

例:iMaxInCost(存货总账-最小入库成本单价)
| |_____________ 含义,;单词第一个字母大写
|_________________ 数据类型是浮点数(目前大多数使用Decimal)数据类型规范:
特殊字段,特殊含义字段命名规范
注:以前有些不是按以上规则设计的,今后再添加的请按这些规则添加。

●数据类型的选用
尽可能使用变长类型(除非数据列长度的确是固定的)。

变长类型只存储列中实际含有的内,检索需要扫描的页会减少。

创建字符类型字段请使用UNICODE数据类型字段,使用nvarchar、nchar、ntext替换varchar、char、text类型,在插入和查询时候使用N’’。

二、数据库语言规范
1.触发器规范
由于数据表触发器容易产生很多数据库问题,一般情况下禁止使用触发器。

请使用系统API的前后事件进行代码编程。

2.视图规范
●不能在视图上创建视图,视图不能产生视图;
●禁止通过视图修改数据;
●禁止修改系统视图;
●用注释说明视图的作用;
●应尽量使用SQL Server 的视图生成器产生视图;
●视图中不要有ORDER BY 排序语句;
●视图中不要使用UNION联合视图;
●禁止使用“Select * from ……”,“Select T.* ……”等语句;
●注意缩进,格式清楚;
●所有关键字要大写;
●字段逗号,运算符等操作符之间有空格相隔;
例子:
CREATE VIEW[dbo].[V_IA_rdrecords32]
/*
销售出库单未记账单据
*/
AS
SELECT Rdrecord.bRdFlag,rdrecord.CBusType,Rdrecord.cBusCode,
ode AS cVouCode,rdrecords.AutoID AS ID,
Rdrecords.iquantity,rdrecords.iunitcost,rdrecords.iprice,
Rdrecords.cVouchCode AS cBatchCode,
Rdrecords.cbaccounter AS cAccounter,rdrecord.cMaker,
CAST(NULL AS TINYINT)AS bFlag,CAST(NULL AS BIT)AS bMoneyFlag,
(CASE WHEN rdrecord.cVouchType=N'32'THEN1ELSE0END)as bSale,
rdrecord.cDefine1,rdrecord.cDefine2,rdrecord.cDefine3,rdrecord.cDefine4, ..........................................................
FROM rdrecords32Rdrecords INNER JOIN rdrecord32rdrecord ON rdrecords.id=rdrecord.id and isnull(rdrecords.cbaccounter,'')=''
LEFT JOIN WareHouse ON WareHouse.cWhcode=rdrecord.cWhCode
LEFT JOIN SO_SODetails ON rdrecords.iorderdid=SO_SODetails.isosid And rdrecords.iordertype=1--销售订单
LEFT JOIN SO_SOMain ON so_sodetails.id=so_somain.id ..................................................................................
3.存储过程规范
●编写存储过程原则
✧将每个存储过程完成一项单独的任务;
✧存储过程可以调用存储过程;
✧存储过程可以调用自定义函数;
✧存储过程中禁止使用全局性质的临时表;
●代码书写规范
✧在创建存储过程的开始处应有注释,
说明该存储过程的功能,存储过程的输入、输出参数的含义。

✧对于存储过程中功能相对独立的SQL代码段给出注释描述功能用途;
✧尽量保证SQL语句的执行顺序,对于每一次的执行单元应尽量保持先读后写的顺序;
✧所改变的SQL Server的系统参数,设置应在退出存储过程时还原(如 SET NOCOUN等);
✧关键字应尽量保持大写;
✧字段逗号,运算符等操作符之间有空格相隔;
✧注意缩进,保持存储过程的可读性;
✧输入、返回参数命名应尽量规则:前缀为参数数据类型的简写,主体是参数描述
常用数据类型简写如下:int i,char chr,nvarchar vch等可参照数据类型规范,
参数描述使用英文,单词的第一个字母大写;
例子:
CREATE PROCEDURE[dbo].[SP_ST_StockInspect]@QueryDate datetime='2003-11-1',
@QueryCondition nvarchar(4000)=N'',
@ComUnitNo int=1
……………………………………………………
AS
/*
在库品待检表
@QueryDate 查询日期
@QueryCondition 查询条件
@ComUnitNo 第几辅计量编号
……………………………………………………
*/
SET NOCOUNT ON
DECLARE@strSql NVARCHAR(4000)
DECLARE@strSql1NVARCHAR(4000)
DECLARE@sQty as NVARCHAR(4000)
SET@strSql=N'exec Prc_SCM_GetStockFuc_ST'
SELECT CONVERT(NVARCHAR(400),'')AS sQty,
CONVERT(NVARCHAR(400),'')AS sNum,
convert(nvarchar(400),'')AS sBQty,CONVERT(NVARCHAR(400),'')AS sBNum,
convert(nvarchar(400),'')AS sInQty,CONVERT(NVARCHAR(400),'')AS sInNum,--预计入
convert(nvarchar(400),'')AS sOutQty,CONVERT(NVARCHAR(400),'')AS sOutNum,
convert(nvarchar(400),'')AS sBInQty,CONVERT(NVARCHAR(400),'')AS sBInNum,
convert(nvarchar(400),'')AS sBOutQty,CONVERT(NVARCHAR(400),'')AS sBOutNum INTO#tmpFuc where1=0
EXECUTE SP_EXECUTESQL@strSql
SELECT@sQty=sQty,@snum=sNum,@sbatchQty=sBQty,@sbatchnum=sBNum FROM#tmpFuc
set@iPreDays=(select isnull(cvalue,0)from accinformation where cname=N'iPreInspectDays') set@iYQDays=(select isnull(cvalue,0)from accinformation where cname=N'iYQInspectDays')
……………………………………………………………………………………..
SET NOCOUNT OFF
4.自定义函数规范
●自定义函数的代码与注释书写规范类似于存储过程;
●自定义函数应看作除了SQL语句外最小执行单位;
●自定义函数中不能调用存储过程;
●自定义函数中只能对表进行操作,不允许对视图进行操作;
●如果自定义函数返回的是数据集,数据量较大时,尽量使用Join语句关联查询,少时用
IN条件语句;
●自定义函数尽量不要用到条件列、查询列中,因为要进行全表数据计算,影响查询性能,
可以用于查询条件中,尽量用于查询条件右侧,使用固定值。

例子:
ALTER FUNCTION[dbo].[FN_GetLastBOM](@PartId int,@CurDate varchar(20))
/*
得到最后版本的BOMID
@PartId 母件物料Id
@CurDate 版本生效日期
*/
RETURNS int
AS
BEGIN
declare@BomID as int
select top1@BomID=b.bomid from bom_parent p inner join bom_bom b on p.bomid=b.bomid where p.ParentId=@PartId and@CurDate between b.VersionEffDate and b.VersionEndDate
order by b.VersionEffDate desc
if@BomID is null
set@BomID=-1
RETURN(@BomID)
END
5.索引规范
●创建索引原则:
在经常作为条件搜索的列上创建索引;
保持索引中的数据量尽可能的少。

在主键上创建索引;
在关键、经常使用的外键上创建索引;
检索方式比较复杂时,应考虑创建复合索引,SQL 2005以上可以创建包含性索引。

在创建复合索引时,应该仔细考虑列的顺序。

对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引才起作用;仅对后面的任意列执行搜索时,复合索
引则没有用处。

特别注意:考虑到执行速度,代码维护,代码的不可控等因素,数据库升级的兼容性等很多方面,一般情况下禁止使用“Select * from ……”;
三、U8开发之脚本文件规则
数据库脚本文件是U8中对数据库操作语句汇总,通过编写脚本更改数据库元素达到增加新功能、修改BUG的目的。

U8中脚本文件的命名、具体存放位置需要遵循一定的规范,以划分不同类型的脚本,方便编写、阅读、运行和管理。

什么是脚本文件?
在开发中经常需要对数据库进行操作,如:增加表、字段,存储过程、触发器,修改表、字段、存储过程、触发器,修改数据等。

这些SQL语句都统一存放在脚本文件中。

主要脚本文件:
结构脚本:对表结构的增删改脚本。

视图脚本:对视图的增删改脚本。

存储过程:对存储过程、触发器、函数的增删改脚本。

数据脚本:对表数据的增删改脚本。

文件命名规范的目标
本文主要介绍脚本文件的命名规则,不符合规则的命名会导致脚本执行出错,遵守同一命名规则也方便管理开发过程中的所有数据库脚本。

脚本文件如何命名?
脚本文件的命名规则如下:数据库_SQL类型_产品_业务类型_语言.sql
1.脚本文件中执行数据库命名规范
脚本名称中的数据库部分表示该脚本文件在哪个数据库中执行,具体值如下。

如:
SYS_STR_EFNF_MIX_NL.SQL表示该脚本在UFSystem数据库运行。

DATA_DATA_EFNF_MIX_NL.SQL表示该脚本在UFDATA开头的数据库运行。

2.脚本文件中SQL执行类型命名规范
SQL类型说明文件中存放SQL语句的类型,总共有4个类型,且有执行的优先级顺序,具体值如下:
如:
SYS_STR_EFNF_MIX_NL.SQL 表示该脚本修改的是UFSystem数据库的表结构。

DATA_DATA_EFNF_MIX_NL.SQL 表示该脚本修改的是UFDATA开头数据库的表数据。

3.脚本文件中产品与项目命名规范
表示该脚本文件隶属的产品号,值对应UFSystem库UA_SubSys_Base表的cSub_ID字段,如果二次开发的插件没有产品号,该值可以自定义,但必须是“EF”开头,如EFNF表示南孚项目,长度不能超过6位。

注意:二次开发脚本名称中的产品不能使用U8标准产品编号,否则会出现互相覆盖现象。

如:
SYS_STR_EFXXX_MIX_NL.SQL
DATA_DATA_ EFXXX _MIX_NL.SQL 表示该脚本属于XXX二次开发项目。

4.脚本文件中业务类型命名规范
业务类型表示该脚本文件涉及到的业务范围,如果某一脚本只用于修改权限,使用这个字段进行区分,具体值如下:
如:
SYS_STR_EFNF_WF_NL.SQL 表示该脚本内容与工作流相关。

DATA_DA TA_EFNF_MIX_NL.SQL 表示该脚本内容不区分业务类型,多种业务类型的脚本放在一个脚本文件中。

5.脚本文件中多语命名规范
U8从V8.61开始支持多语言,数据库中与界面显示有关的表会包含多种语言数据,对多语言数据进行增删改时需要把sql脚本按照修改内容的语言进行区分,不同语言标识的脚本有执行的先后顺序。

具体值如下:
如:
SYS_STR_EFNF_WF_NL.SQL 表示该脚本内容与语言无关。

DATA_DA TA_EFNF_MIX_CN.SQL 表示该脚本内容修改的是简体中文的数据。

相关文档
最新文档