KingbaseES 对象状态规则总结

KingbaseES 的PLSQL对象包括函数、存储过程、触发器、包、包体、对象类型、对象类型体和匿名块,其中匿名块即用即销,不具有状态属性,SQL中存在依赖的常见对象是表,视图,索引,自定义类型,自定义操作符等等。在使用编码过程会存在相互引用和被引用,就会导致对象的增删改无法“顺利”进行,本文针对V9版本开始支持的对象状态功能进行说明。

1,配置参数

1.1 配置说明

KingbaseES的PLSQL对象状态的启动功能,可以通过ora_func_style参数控制。ora_func_style为user级别的boolean型参数,默认为false,即不开启对象状态功能。参数开启后可以用来记录对象的状态有效或者无效,同时解除一些对象之间的强依赖关系,使用户能够修改或者删除依赖的对象。配置具体如下:

  1. 通过set命令进行配置,该配置是session级,session退出后将不再生效

set ora_func_style to on;

  1. 通过kingbase.conf进行配置,添加一下语句到配置文件末尾并保存,该配置是全局生效。

ora_func_style=on;

需要说明的是:

1,ora_func_style开启为ON后,plsql.compile_checks在创建对象时被启用进行相应的对象存在与否检查,不管这个参数是否被开启,因此你可能会看到创建PLSQL对象时原本不报错的地方现在会报错,比如xxx无效,xxx缺失。

2,ora_func_style开启为ON后,如果创建对象A时,缺失依赖对象B,此时A虽然能入库但是会是无效对象且报错。当B成功创建后A将自动恢复成有效,运行正常。

1.2 名词解释

为了更好的理解依赖关系问题,我们定义一些名词:

名词 说明
PL对象头 1. 其中函数,存储过程,触发器的创建语句中AS关键字到CREATE之间的语句;
2. 对包和对象类型而言,包头和对象类型头整个创建语句,即整个CREATE PACKAGE/TYPE到END的语句。
PL对象体 1. 其中函数,存储过程,触发器的创建语句中AS关键字到END之间的语句;
2. 对包和对象类型而言,包体和对象类型体的整个创建语句,即整个CREATE PACKAGE/TYPE BODY到END的语句。
其他对象头 可以简单把上述PL对象以外的都归类为其他对象头,比如自定义集合类型(CREATE TYPE),创建索引(CREATE INDEX),自定义操作符等等,整个完整的创建语句都是对象头结构。
主对象 当前引用其他数据库对象的对象 ,比如函数索引中的索引就是主对象,索引函数就是依赖对象
依赖对象 被主对象引用的其他数据库对象
强依赖关系 主对象不受影响,但依赖对象删除(DROP)、部分修改操作(ALTER)或者重建(CREATE OR REPLACE)会受到限制,需要先删除主对象或者使用级联删除(DROP…CASCADE)。
弱依赖关系 主对象不受影响,依赖对象的删除(DROP)、修改(ALTER)或者重建(CREATE OR REPLACE)操作不会受到任何限制。

2,依赖规则说明

KES的依赖关系总结为两大类,强依赖关系和弱依赖关系。

依赖关系的强弱只和主对象的类型以及涉及的结构(对象头还是对象体)有关,和依赖对象无关。

其中决定依赖关系的强弱的因素具体是:

  1. 主对象的类型,比如是PL包头,PL函数会产生不同强弱的依赖。
  2. 依赖对象在主对象的创建语句结构的哪部分被引用。

在启用或者关闭ora_func_style参数的两种情况下,KingbaseES中数据库对象的主对象和引用之间的依赖关系表现情况如下表 1:

表1 对象的依赖强弱规则表

NO 主对象类型 主对象结构类型 特殊说明 ora_func_style ora_func_style
1 函数/存储过程/触发器 对象头 NAN 强依赖关系 强依赖关系
2 函数/存储过程/触发器 对象体 NAN 弱依赖关系 弱依赖关系
3 包头,对象类型头 对象头 类型定义语句产生依赖 强依赖关系 强依赖关系
4 包头,对象类型头 对象头 其他内部对象头 弱依赖关系 强依赖关系
5 包体,对象类型体 对象体 NAN 弱依赖关系 弱依赖关系
6 SQL对象-视图 对象头 NAN 弱依赖关系 弱依赖关系
7 其余SQL对象 对象头 NAN 强依赖关系 强依赖关系

注意ora_func_style为ON或者OFF下的依赖关系,均是在该参数下创建的对象,产生依赖形成的关系。

以上就是目前KingbaseES的整体依赖关系表现情况。

3,依赖关系实例验证

​ 我们根据《表1 对象的依赖强弱规则表》逐一对弱关系情况进行说明。

情况1:在函数等的对象头中存在依赖的情况

本情况对应《表1 对象的依赖强弱规则表》中序号1的情况。

主对象类型 主对象结构类型 特殊说明 ora_func_style ora_func_style
函数/存储过程 触发器 对象头 NAN 强依赖关系 强依赖关系

代码示例1-1:

DROP TABLE  IF EXISTS  TT01;
CREATE TABLE TT01(ID INT,NAME VARCHAR(20));
INSERT INTO TT01 VALUES(10,'AAAA');

CREATE OR REPLACE PROCEDURE PROC01(p1 TT01%ROWTYPE)   ---在对象头中产生了依赖
AS
DECLARE  
  VV INT;
BEGIN
  SELECT ID INTO VV FROM TT01 WHERE ID = 10;
END;

这个例子中,

主对象:存储过程PROC01,

依赖对象:是TT01,

依赖结构:存储过程PROC01的对象头引用了TT01,

依赖关系:强依赖关系。

操作限制:无法直接删除(主对象PROC01操作不受影响)。

其他:无论ora_func_style开启与否,均是强依赖关系。函数和触发器也是同理,不再累述。

一些测试,此场景DROP不被允许,但是ALTER操作还是被允许的:

---删除表
drop table tt04;     ----不可以,报错如下
ERROR:  cannot drop table tt01 because other objects depend on it
DETAIL:  procedure proc01(tt01) depends on type tt01
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

---增加表字段,可以
ALTER TABLE TT01  ADD PID NUMBER;    ---本例可以执行
---删除表字段,可以
ALTER TABLE TT01 DROP COLUMN ID;     ---本例可以执行
---重命名表,
ALTER TABLE TT01 RENAME TO TT04;     ---本例可以执行(这个尽然都可以)
---重命名表字段
ALTER TABLE TT04 RENAME COLUMN name TO sal_name;      ---本例可以执行
---修改表字段类型
ALTER TABLE TT04 ALTER COLUMN sal_name TYPE varchar(40);  ---本例可以执行
---增加默认值
ALTER TABLE TT04 ALTER COLUMN sal_name SET DEFAULT 'zzzzz';    ---本例可以执行
---删除默认值
ALTER TABLE TT04 ALTER COLUMN sal_name DROP DEFAULT;   ---本例可以执行
---增加约束
ALTER TABLE TT04 ADD CHECK (sal_name <> '');   ---本例可以执行
ALTER TABLE TT04 ADD CONSTRAINT some_name UNIQUE (pid);   ---本例可以执行

说明:

这些alter操作之所以均被允许,是因为表的OID在修改(ALTER)后也不会改变,因此不会被强依赖限制。

但并不是所有强依赖关系时(依赖表),都能对表进行任意ALTER,包头(对象头)中游标依赖表算是一种特殊情况,就算表的OID在ALTER

时不做变动也不能修改。

如下代码示例1-2:

DROP TABLE  IF EXISTS  TT01;
CREATE TABLE TT01(ID INT,NAME VARCHAR(20));
INSERT INTO TT01 VALUES(10,'AAAA');

CREATE TYPE tab_typ IS TABLE OF int;

CREATE OR REPLACE PACKAGE pkg_test01 AS 
    t1 tab_typ := tab_typ();    ---在包头中对外部自定义类型产生依赖
    CURSOR vcur IS SELECT * FROM tt01 WHERE id > 0;    
END;

一些测试结果:
DROP TYPE tab_typ  ;
--执行结果:
SQL 错误 [2BP01]: 错误: 无法删除 类型 tab_typ 因为有其它对象倚赖它
  Detail: 包 pkg_test01 倚赖于 类型 tab_typ
  Hint: 使用 DROP .. CASCADE 把倚赖对象一并删除.

DROP TABLE tt01 ;
--执行结果:
SQL 错误 [2BP01]: 错误: 无法删除 表 tt01 因为有其它对象倚赖它
  Detail: 包 pkg_test01 倚赖于 表 tt01
  Hint: 使用 DROP .. CASCADE 把倚赖对象一并删除.

---增加表字段
ALTER TABLE TT01  ADD PID NUMBER;    ---本例不可以
---删除表字段
ALTER TABLE TT01 DROP COLUMN ID;     ---本例不可以
---重命名表,
ALTER TABLE TT01 RENAME TO TT04;     ---本例不可以
---重命名表字段
ALTER TABLE TT04 RENAME COLUMN name TO sal_name;      ---本例不可以
---修改表字段类型
ALTER TABLE TT04 ALTER COLUMN sal_name TYPE varchar(40);  ---本例不可以
---增加默认值
ALTER TABLE TT04 ALTER COLUMN sal_name SET DEFAULT 'zzzzz';    ---本例不可以
---删除默认值
ALTER TABLE TT04 ALTER COLUMN sal_name DROP DEFAULT;   ---本例不可以
---增加约束
ALTER TABLE TT04 ADD CHECK (sal_name <> '');   ---本例不可以
ALTER TABLE TT04 ADD CONSTRAINT some_name UNIQUE (pid);   ---本例不可以

值得一提的是本特殊案例,其实归属情况4,可以在ora_func_style开启为on时创建后,解除强依赖,变为弱依赖关系,届时可以对表进行ALTER和DROP操作。

情况2:在函数等的对象体中存在依赖的情况

本情况对应《表1 对象的依赖强弱规则表》中序号2的情况。

主对象类型 主对象结构类型 特殊说明 ora_func_style ora_func_style
函数/存储过程 触发器 对象体 NAN 弱依赖关系 弱依赖关系

代码示例2:

DROP TABLE  IF EXISTS  TT01;
CREATE TABLE TT01(ID INT,NAME VARCHAR(20));
INSERT INTO TT01 VALUES(10,'AAAA');

CREATE OR REPLACE PROCEDURE PROC02
AS
DECLARE  
  VV INT;
  A1 TT01%ROWTYPE;   ---在函数的对象体中产生了依赖
  A2 TT01.ID%TYPE;   ---在函数的对象体中产生了依赖
BEGIN
  SELECT ID INTO VV FROM TT01 WHERE ID = 10;
END;

这个例子中,

主对象:存储过程PROC02,

依赖对象:TT01表

依赖结构:存储过程PROC01的对象体中引用了TT01,

依赖关系:弱依赖关系

操作限制:主对象和依赖对象的任何操作均不做限制

其他:无论ora_func_style开启与否,均是弱依赖关系。函数和触发器也是同理,不再累述。

一些测试(均被允许操作):

---删除表
drop table tt01;     ----本例可以,因为是弱依赖
---增加表字段,可以
ALTER TABLE TT01  ADD PID NUMBER;    ---本例可以执行
---删除表字段,可以
ALTER TABLE TT01 DROP COLUMN ID;     ---本例可以执行
---重命名表,
ALTER TABLE TT01 RENAME TO TT04;     ---本例可以执行(这个尽然都可以)
---重命名表字段
ALTER TABLE TT04 RENAME COLUMN name TO sal_name;      ---本例可以执行
---修改表字段类型
ALTER TABLE TT04 ALTER COLUMN sal_name TYPE varchar(40);  ---本例可以执行
---增加默认值
ALTER TABLE TT04 ALTER COLUMN sal_name SET DEFAULT 'zzzzz';    ---本例可以执行
---删除默认值
ALTER TABLE TT04 ALTER COLUMN sal_name DROP DEFAULT;   ---本例可以执行
---增加约束
ALTER TABLE TT04 ADD CHECK (sal_name <> '');   ---本例可以执行
ALTER TABLE TT04 ADD CONSTRAINT some_name UNIQUE (pid);   ---本例可以执行

情况3:在包等对象头中存在依赖的情况A

本情况对应《表1 对象的依赖强弱规则表》中序号3的情况。想表达的意思是,当我们在包头,对象类型头中定义一个类型时,而这个类型对数据库中的其他数据类型产生了依赖,则是强依赖。此情况是很特殊的情况,无法通过ora_func_style解除强依赖限制。

主对象类型 主对象结构类型 特殊说明 ora_func_style ora_func_style
包头,对象类型头 对象头 类型定义语句产生依赖 强依赖关系 强依赖关系

代码示例3:

CREATE TYPE tab_typ IS TABLE OF int;

CREATE OR REPLACE PACKAGE pkg_test01 AS 
    TYPE tab_typ2 IS TABLE OF tab_typ;
END;

这个例子中,

主对象:包pkg_test01,

依赖对象:类型tab_typ,

依赖结构:包头pkg_test01,即对象头

依赖关系:强依赖关系,

操作限制:tab_typ无法直接删除(DROP),或者修改(ALTER),主对象pkg_test01操作不受影响。

其他:无论ora_func_style开启与否,均是强依赖关系。对象类型(Object type)也是同理,不再累述。

一些测试:

DROP TYPE tab_typ ;

SQL 错误 [2BP01]: 错误: 无法删除 类型 tab_typ 因为有其它对象倚赖它
  Detail: 包 pkg_test01 倚赖于 类型 tab_typ
  Hint: 使用 DROP .. CASCADE 把倚赖对象一并删除.

情况4:在包等对象头中存在依赖的情况B

本情况对应《表1 对象的依赖强弱规则表》中序号4的情况。

主对象类型 主对象结构类型 特殊说明 ora_func_style ora_func_style
包头,对象类型头 对象头 其他内部对象头 弱依赖关系 强依赖关系

从这个表可以看出,ora_func_style为off时原本是强依赖关系,可以在开启这个参数后变更为弱依赖关系,也就达成了对依赖对象的删除(DROP),修改(ALTER)等操作。

代码示例4-1:ora_func_style为off时创建所有对象

DROP TABLE  IF EXISTS  TT01;
CREATE TABLE TT01(ID INT,NAME VARCHAR(20));
INSERT INTO TT01 VALUES(10,'AAAA');

CREATE TYPE tab_typ IS TABLE OF int;

CREATE OR REPLACE PACKAGE pkg_test01 AS 
    t1 tab_typ := tab_typ();    ---在包头中对外部自定义类型产生依赖
    t2 TT01%ROWTYPE ;          ---在包头中对外部普通表产生依赖
    FUNCTION func01() RETURN tab_typ;   ----产生依赖
END;

CREATE OR REPLACE PACKAGE BODY pkg_test01 AS 
    FUNCTION func01() RETURN tab_typ
    AS 
        tt2 tab_typ := tab_typ();
    BEGIN 
        tt2.extend();
        tt2(1) = 10;
        RETURN tt2;
    END;
END;

这个例子中,

主对象:包pkg_test01,

依赖对象:类型tab_typ,表TT01

依赖结构:包头pkg_test01,即对象头

依赖关系:强依赖关系(ora_func_style为off时)

操作限制:tt01和tab_typ无法直接删除(DROP),主对象pkg_test01操作不受影响。

其他:对象类型(Object type)也是同理,不再累述。

一些测试:

DROP TYPE tab_typ ;

---执行结果如下
SQL 错误 [2BP01]: 错误: 无法删除 类型 tab_typ 因为有其它对象倚赖它
  Detail: 包 pkg_test01 倚赖于 类型 tab_typ
  Hint: 使用 DROP .. CASCADE 把倚赖对象一并删除.

DROP TABLE tt01 ;

---执行结果如下
SQL 错误 [2BP01]: 错误: 无法删除 表 tt01 因为有其它对象倚赖它
  Detail: 包 pkg_test01 倚赖于 类型 tt01
  Hint: 使用 DROP .. CASCADE 把倚赖对象一并删除.


---增加表字段,可以
ALTER TABLE TT01  ADD PID NUMBER;    ---本例可以执行
---删除表字段,可以
ALTER TABLE TT01 DROP COLUMN ID;     ---本例可以执行
---重命名表,
ALTER TABLE TT01 RENAME TO TT04;     ---本例可以执行
---重命名表字段
ALTER TABLE TT04 RENAME COLUMN name TO sal_name;      ---本例可以执行
---修改表字段类型
ALTER TABLE TT04 ALTER COLUMN sal_name TYPE varchar(40);  ---本例可以执行
---增加默认值
ALTER TABLE TT04 ALTER COLUMN sal_name SET DEFAULT 'zzzzz';    ---本例可以执行
---删除默认值
ALTER TABLE TT04 ALTER COLUMN sal_name DROP DEFAULT;   ---本例可以执行
---增加约束
ALTER TABLE TT04 ADD CHECK (sal_name <> '');   ---本例可以执行
ALTER TABLE TT04 ADD CONSTRAINT some_name UNIQUE (pid);   ---本例可以执行

代码示例4-2:ora_func_style为on时创建所有对象

DROP TABLE  IF EXISTS  TT01;
CREATE TABLE TT01(ID INT,NAME VARCHAR(20));
INSERT INTO TT01 VALUES(10,'AAAA');

CREATE TYPE tab_typ IS TABLE OF int;

CREATE OR REPLACE PACKAGE pkg_test01 AS 
    t1 tab_typ := tab_typ();    ---在包头中对外部自定义类型产生依赖
    t2 TT01%ROWTYPE ;          ---在包头中对外部普通表产生依赖
    FUNCTION func01() RETURN tab_typ;   ----产生依赖
END;

CREATE OR REPLACE PACKAGE BODY pkg_test01 AS 
    FUNCTION func01() RETURN tab_typ
    AS 
        tt2 tab_typ := tab_typ();
    BEGIN 
        tt2.extend();
        tt2(1) = 10;
        RETURN tt2;
    END;
END;

这个例子中,

主对象:包pkg_test01,

依赖对象:类型tab_typ,表TT01

依赖结构:包头pkg_test01,即对象头

依赖关系:弱依赖关系(ora_func_style为on时)

操作限制:依赖对象的操作不受限制,主对象pkg_test01操作不受影响。

其他:对象类型(Object type)也是同理,不再累述。这个场景实际上就是ora_func_style要针对和处理的场景,将强依赖变更为弱依赖。

一些测试:

DROP TYPE tab_typ;     ---本例可以
DROP TABLE tt01;     ---本例可以

CREATE TABLE TT01(ID INT,NAME VARCHAR(20));  ---删除后重新创建
INSERT INTO TT01 VALUES(10,'AAAA');
DROP TABLE tt04;

---增加表字段
ALTER TABLE TT01  ADD PID NUMBER;    ---本例可以
---删除表字段
ALTER TABLE TT01 DROP COLUMN ID;     ---本例可以
---重命名表,
ALTER TABLE TT01 RENAME TO TT04;     ---本例可以
---重命名表字段
ALTER TABLE TT04 RENAME COLUMN name TO sal_name;      ---本例可以
---修改表字段类型
ALTER TABLE TT04 ALTER COLUMN sal_name TYPE varchar(40);  ---本例可以
---增加默认值
ALTER TABLE TT04 ALTER COLUMN sal_name SET DEFAULT 'zzzzz';    ---本例可以
---删除默认值
ALTER TABLE TT04 ALTER COLUMN sal_name DROP DEFAULT;   ---本例可以
---增加约束
ALTER TABLE TT04 ADD CHECK (sal_name <> '');   ---本例可以
ALTER TABLE TT04 ADD CONSTRAINT some_name UNIQUE (pid);   ---本例可以

可以看出ora_func_style开启为ON此情况将转换为弱依赖情况,对依赖对象的操作不做限制。

情况5:在包等对象体中存在依赖的情况

主对象类型 主对象结构类型 特殊说明 ora_func_style ora_func_style
包体,对象类型体 对象体 NAN 弱依赖关系 弱依赖关系

代码示例5:

DROP TABLE  IF EXISTS  TT01;
CREATE TABLE TT01(ID INT,NAME VARCHAR(20));
INSERT INTO TT01 VALUES(10,'AAAA');

CREATE TYPE tab_typ IS TABLE OF int;

CREATE OR REPLACE PACKAGE pkg_test01 AS 
    FUNCTION func01() RETURN int ;   ----产生依赖
END;

CREATE OR REPLACE PACKAGE BODY pkg_test01 AS 
    FUNCTION func01() RETURN int 
    AS 
        t1 tab_typ := tab_typ();    ---在包头中对外部自定义类型产生依赖
        t2 TT01%ROWTYPE ;          ---在包头中对外部普通表产生依赖
        t3 TT01.ID%TYPE ;          ---在包头中对外部普通表产生依赖
    BEGIN 
        t1.extend();
        t1(1) = 10;
        RETURN 1;
    END;
END;

这个例子中,

主对象:包pkg_test01,

依赖对象:是TT01表,tab_typ自定义类型

依赖结构:包pkg_test01体的函数func01,即对象体

依赖关系:弱依赖关系,

操作限制:依赖对象和主对象的操作均不受影响。

其他:无论ora_func_style开启与否,均是弱依赖关系。对象类型(Object Type)也是同理,不再累述。

一些测试:

DROP TYPE tab_typ;    --本例可以
DROP TABLE tt01;    --本例可以

CREATE TABLE TT01(ID INT,NAME VARCHAR(20));  ---删除后重新创建
INSERT INTO TT01 VALUES(10,'AAAA');

DROP TABLE tt04;
---增加表字段
ALTER TABLE TT01  ADD PID NUMBER;    ---本例可以
---删除表字段
ALTER TABLE TT01 DROP COLUMN ID;     ---本例可以
---重命名表,
ALTER TABLE TT01 RENAME TO TT04;     ---本例可以
---重命名表字段
ALTER TABLE TT04 RENAME COLUMN name TO sal_name;      ---本例可以
---修改表字段类型
ALTER TABLE TT04 ALTER COLUMN sal_name TYPE varchar(40);  ---本例可以
---增加默认值
ALTER TABLE TT04 ALTER COLUMN sal_name SET DEFAULT 'zzzzz';    ---本例可以
---删除默认值
ALTER TABLE TT04 ALTER COLUMN sal_name DROP DEFAULT;   ---本例可以
---增加约束
ALTER TABLE TT04 ADD CHECK (sal_name <> '');   ---本例可以
ALTER TABLE TT04 ADD CONSTRAINT some_name UNIQUE (pid);   ---本例可以

情况6:在视图中存在依赖的情况

主对象类型 主对象结构类型 特殊说明 ora_func_style ora_func_style
视图 对象头 NAN 弱依赖关系 弱依赖关系

代码示例6:

CREATE OR REPLACE FUNCTION calculate_id(oldid int)  
RETURNS int 
AS 
BEGIN  
    RETURN oldid * 2 + 1;  
END;

DROP VIEW  IF EXISTS "tt01_view";
DROP TABLE  IF EXISTS  "TT01";
CREATE TABLE TT01(ID INT,NAME VARCHAR(20));
INSERT INTO TT01 VALUES(10,'AAAA');

CREATE VIEW tt01_view AS  
SELECT  
    name,  
    calculate_id(id) AS newid  
FROM  
    tt01;

SELECT * FROM tt01_view;

因为是弱依赖,直接测试:

DROP FUNCTION calculate_id;  --可以执行

--提示
视图 tt01_view 倚赖于 function calculate_id(integer)

其他:此情况相当于是SQL对象作为主对象,在依赖其他对象时的一种特殊情况(其余情况可以参见情况7),只有这种情况是弱依赖。

如果是其他对象,比如索引(索引函数),属于强依赖,将存在操作限制。

情况7:在其他SQL对象存在依赖的情况

主对象类型 主对象结构类型 特殊说明 ora_func_style ora_func_style
其余SQL对象 对象头 NAN 强依赖关系 强依赖关系

代码示例7:

DROP TABLE  IF EXISTS  TT01;
CREATE TABLE TT01(ID INT,NAME VARCHAR(20));
INSERT INTO TT01 VALUES(10,'AAAA');

CREATE INDEX tt01_name_upper ON TT01 (my_UPPER(name));

CREATE OR REPLACE FUNCTION my_UPPER(pname varchar)  
RETURNS varchar 
AS 
$$
BEGIN  
    RETURN upper(pname)  ;
END;
$$language plpgsql IMMUTABLE ;

一些测试:

DROP FUNCTION my_UPPER;

--执行后报错:
SQL 错误 [2BP01]: 错误: 无法删除 function my_upper(varchar) 因为有其它对象倚赖它
  Detail: 索引 tt01_name_upper 倚赖于 function my_upper(varchar)
  Hint: 使用 DROP .. CASCADE 把倚赖对象一并删除.

---支持重建 
CREATE OR REPLACE FUNCTION my_UPPER(pname varchar)  
RETURNS varchar 
AS 
$$
BEGIN  
    RETURN upper(pname) || 'aaa';
END;
$$language plpgsql IMMUTABLE ;  

主对象:索引tt01_name_upper,

依赖对象:索引函数my_upper,

依赖结构:SQL对象,即对象头

依赖关系:强依赖关系,

操作限制:依赖对象的删除(DROP),将受到限制。

其他:无论ora_func_style开启与否,均是强依赖关系。其他SQL对象不再累述。

4,总结

再次回到这张表:

表1 对象的依赖强弱规则表

NO 主对象类型 主对象结构类型 特殊说明 ora_func_style ora_func_style
1 函数/存储过程/触发器 对象头 NAN 强依赖关系 强依赖关系
2 函数/存储过程/触发器 对象体 NAN 弱依赖关系 弱依赖关系
3 包头,对象类型头 对象头 类型定义语句产生依赖 强依赖关系 强依赖关系
4 包头,对象类型头 对象头 其他内部对象头 弱依赖关系 强依赖关系
5 包体,对象类型体 对象体 NAN 弱依赖关系 弱依赖关系
6 SQL对象-视图 对象头 NAN 弱依赖关系 弱依赖关系
7 其余SQL对象 对象头 NAN 强依赖关系 强依赖关系

总体上归纳为:

  1. 如果ora_func_style为OFF时是弱依赖,那ora_func_style为ON也是弱依赖。

  2. KES中ora_func_style的核心作用就是解决表中序号为4的使用场景,将其置为弱依赖状态。

  3. 弱依赖关系,在对象体(创建语句中的执行语句区域)中产生的关系;弱依赖对主依赖对象和依赖对象的增删改都不做限制。

  4. 强依赖关系,在对象头(创建语句中的定义语句区域)中产生的关系;强依赖对主依赖对象不做限制,但对依赖对象的增删改有一些限

制(不允许直接删除,可能也会影响部分ALTER操作,并非所有的操作都不被允许)。

posted @ 2024-07-26 11:05  KINGBASE研究院  阅读(2)  评论(0编辑  收藏  举报