SQL Server 2008数据库完整性的应用探索

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

SQL Server 2008数据库完整性的应用探索

发表时间:2019-07-29T11:42:00.673Z 来源:《基层建设》2019年第14期作者:宋龙坤王杰陈梅[导读] 摘要:随计算机技术和网络应用的普及,数据库技术在据计算机领域作用日益突出,SQL标准使用一系列的概念来描述完整性,包括关系模型的实体完整性、参照完整性、用户定义完整性等。山东协和学院山东济南 250107摘要:随计算机技术和网络应用的普及,数据库技术在据计算机领域作用日益突出,SQL标准使用一系列的概念来描述完整性,包括关系模型的实体完整性、参照完整性、用户定义完整性等。本文基于SPJ数据库系统的开发,阐述了数据库完整性的理论和实践,并对数据库完整性问题进行探讨。

关键词:SQL Server;数据完整性;SPJ数据库系统;

1 引言数据库完整性是指数据库中数据的正确性和相容性,而合理的数据完整性既能减少数据冗余,又能在测试中尽早发现错误,提高系统效率。而SQL Server数据库系统是一种关系数据库系统,扩张性非常强,性能也很高,在实现数据库的完整性方面有充分体现。关系数据库的实体完整性在CREATE TABLE 中通过PRIMARY KEY定义实现,参照完整性在CREATE TABLE 中利用FOREIGN KEY短语确定哪些列为外码,REFERENCES短语指明外码参照哪些表的主码。而用户定义的完整性是根据应用要求,来定义属性的约束条件。完整性约束条件包括NOT NULL、CHECK等语句。断言,则利用数据定义语言中的CREATE ASSERTION 语句,通过声明性断言指定更具一般性的约束。触发器是对表进行插入,更新,删除时会自动执行的特殊存储过程。采取一系列方案,保证了数据库的完整性。

2 SPJ数据库管理系统简介设有一个SPJ数据库,包括S,P,J,SPJ四个关系模式: S(SNO,SNAME,STATUS,CITY); P(PNO,PNAME,COLOR,WEIGHT); J(JNO,JNANE,CITY); SPJ(SNO,PNO,JNO,QTY)。其中:供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成;零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成;工程项目表J 由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成;供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量组成(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。

3 数据库完整性的实现方法 3.1实体完整性关系数据库的实体完整性在CREATE TABLE 中用PRIMARY KEY定义。以上述P表中的Pno设为主键为例:(1)在列级定义的主键 CREATE TABLE P ( PNO CHAR(9) PRIMARY KEY, /*在列级定义主键*/ PNAME CHAR(20) NOT NULL, COLOR CHAR(9), WEIGHT CHAR(9));(2)在表级定义的主键 CREATE TABLE P ( PNO CHAR(9), PNAME CHAR(20) NOT NULL, COLOR CHAR(9), WEIGHT CHAR(9), PRIMARY KEY(pno) /*在表级定义主码*/ );

3.2参照完整性参照完整性在CREATE TABLE 中用FOREIGN KEY短语定义哪些列为外码,REFERE短语指明这些外码参照哪些表的主码。以定义SPJ 中的参照完整性为例: CREATE TABLE SPJ (SNO CHAR(4) NOT NULL, PNO CHAR(4) NOT NULL, JNO CHAR(4) NOT NULL, QTY INT, primary key(Sno,Pno,JNO) foreign key sno references s(sno); foreign key pno references p(pno); foreign key jno references j(jno))

3.3用户定义的完整性

用户定义的完整性是在CREATE TABLE 中定义属性的同时,根据应用要求定义属性上的约束条件,即属性值限制,包括:列值非空(NOT NULL);列值唯一(UNIQUE);检查列值是否满足一个条件表达式(CHECK短语)。

(1)不允许为空。CREATE TABLE SPJ中的SNO、PNO、JNO均是。

(2)列值唯一。以简化建立P表,要求Pname列取值唯一,Pno列为主码为例:

CREATE TABLE P,

(PNO NUMERIC(2),

PNAME CHAR(9)UNIQUE NOT NULL,/* Pname唯一,且不能取空值*/

PRIMARY KEY(Pno)

);

其中,NUMERIC表示数字;UNIQUE表示唯一的。

(3)用CHAR短语指定列值应该满足的条件。以P表的Weight 必须大于0为例:

CERATE TABLE P

(PNO CHAR(9) PRIMARY KEY,/*在列级定义主码*/

PNAME CHAR(8)NOT NULL, /*Pname属性不允许取空值*/

COLOR CHAR(20),

WEIGHT CHAR(2)CHECK(Weight >0)

);

3.4完整性约束

(1)命名子句:CONSTRAINT <完整性约束条件名><完整性约束条件>。<完整性约束条件>包括NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK短语等。

例如:CONSTRAINT C1 CHECK(Pno BETWEEN 12 AND 40)用于检查零件重量是否位于12—40之间,CONSTRAINT C2 NOT NULL用于控制零件名为非空,CONSTRAINT PKey PRIMARY KEY(Pno)即为主键约束。

(2)表中的完整性限制是可以修改的,可通过使用ALTER TABLE 语句实现。以修改P中的约束条件,要求零件重量改在0—50之间可先删除原来的约束条件,再增加新的约束限制。

ALTER TABLE P DROP CONSTRAINT C1;

ALTER TABLE P ADD CONSTRAINT C1 CHECK(Weight BETWEEN 0 AND 50);

3.5域中的完整性限制

<1>以建立一个颜色域,且限制其中的命名为例:

代码:CREATE DOMAIN Colorr CHAR(2)

CONSTRAINT GO CHECK(V ALUE IN(‘红’,‘绿’));

<2>以删除域Colorr 的限制条件GD为例:

代码:ALTER DOMAIN Colorr

DROP CONSTRAINT GD;

<3>以在域Colorr上增加性别限制条件GDD为例:

代码:ALTER DOMAIN Colorr

ADD CONSTRAINT GDD CHECK(V ALUE IN(‘1’,’0’));

3.6触发器

SQL使用CERATE TRIGGER 命令触发器,一般格式:

CREATE TRIGGER<触发器名>

{BEFORE|AFTER}<触发事件>ON<表名>

REFERENCING NEW|OLD ROW AS <变量>

FOR EACH {ROW|STATEMENT}

[WHEN <触发条件>]<触发动作体>

(1)一个触发器

当对表SPJ的QTY属性进行修改时,若供应数量增加了10%,则将此次操作记录到另一个表PJ-U(Pno,Jno,Oldqty,Newqty)中,其中,Oldqty是修改前的供应数量,Newqty是修改后的供应数量。

CREATE TRIGGER PJ_T

AFTER UPDATE OF QTY ON SPJ

REFERENCING

OLDROW AS OLDQTY,

NEWROW AS NEWQTY,

FOR EACH ROW /*行级触发器,即每执行一次QTY的更新,下面的规则就行一次*/

WHEN(NEW TUPLE.QTY>=1.1* OLDTUPLE.QTY)

/*触发条件,只有该条件为真时才执行*/

INSERT INTO SC_U(PNO,JNO,OLDQTY,NEWQTY)

V ALUES(OLDQTY.PNO,OLDQTY.JNO,OLDQTY.QTY,NEWQTY.QTY)

其中,PJ_T是触发器的名字,UPDATE OF QTY ON PJ是触发事件,AFTER是触发的时机,表示对当时SPJ的QTY属性修改完后再触发下面的规则。REFERENCING指出引用的变量,如果触发时间是UPDATE操作并且有FOR EACH ROW子句,则可以引用的变量有OLDROW和NEWROW分别修改之前的原则和修改后的元组。若没有FOR EACH ROW子句,则可以引用的变量有OLDTABLE(指表原来

相关文档
最新文档