GBase 8s
其他
文章

南大通用GBase 8s 之 DBACCNOIGN 环境变量简介

发表于2026-02-25 14:43:39230次浏览9个评论


使用 DBACCNOIGN 环境变量,可以指定在发生指定的错误时 dbaccess的行为。

  • 未设置 DBACCNOIGN(默认行为):错误发生前已执行的 SQL 语句会被提交。
  • 设置 DBACCNOIGN=1:发生错误时,退出 dbaccess并自动回滚整个未完成的事务。

注:为保证操作连续性,建议不设置此环境变量生效。

实例演示

示例1、未设置 DBACCNOIGN

1、准备数据。

drop table receipts;
drop table customer;
create table receipts(name varchar(20),n1 int);
CREATE TABLE customer (
   cust_id      SERIAL PRIMARY KEY,
   cust_name    VARCHAR(50) NOT NULL,
   balance      DECIMAL(12,2) DEFAULT 0.00,
   status       CHAR(1) DEFAULT 'A',
   create_date  DATE,
   modify_date  DATETIME YEAR TO SECOND
);
INSERT INTO customer (cust_name, balance, create_date, status)
VALUES ('张三', 5000.00, TODAY, 'A');
INSERT INTO customer (cust_name, balance, status) VALUES  ('李四', 3000.00, 'A'), ('王五', 8000.00, 'A'),('赵六', 1500.00, 'I');
---查询
> select * from receipts;

name                          n1

No rows found.
> select * from customer;

cust_id      1
cust_name    张三
balance      5000.00
status       A
create_date  2025 12月 31日
modify_date
cust_id      2
cust_name    李四
balance      3000.00
status       A
create_date
modify_date
cust_id      3
cust_name    王五
balance      8000.00
status       A
create_date
modify_date
cust_id      4
cust_name    赵六
balance      1500.00
status       I
create_date
modify_date
4 row(s) retrieved.

2、执行以下语句,在事务中进行插入、更新操作。

BEGIN WORK;
INSERT INTO receipts VALUES ('cust1', 10);
INSERT INTO receipt VALUES ('cust1', 20);
INSERT INTO receipts VALUES ('cust1', 30);
UPDATE customer  SET status =   'B';   
COMMIT WORK;

3、查询表数据,如果未在环境中设置 DBACCNOIGN,会将两条记录插入到 receipts 表中,并更新 customer 表的status 字段。

> select * from customer;

cust_id      1
cust_name    张三
balance      5000.00
status       B
create_date  2025 12月 31日
modify_date
cust_id      2
cust_name    李四
balance      3000.00
status       B
create_date
modify_date
cust_id      3
cust_name    王五
balance      8000.00
status       B
create_date
modify_date
cust_id      4
cust_name    赵六
balance      1500.00
status       B
create_date
modify_date
4 row(s) retrieved.
> select * from receipts;

name                          n1
cust1                         10
cust1                         30
2 row(s) retrieved.

示例2 设置 export DBACCNOIGN=1 

1、执行以下语句,重新准备数据

dbaccess testdb -
drop table receipts;
drop table customer;
create table receipts(name varchar(20),n1 int);
CREATE TABLE customer (
   cust_id      SERIAL PRIMARY KEY,
   cust_name    VARCHAR(50) NOT NULL,
   balance      DECIMAL(12,2) DEFAULT 0.00,
   status       CHAR(1) DEFAULT 'A',
   create_date  DATE,
   modify_date  DATETIME YEAR TO SECOND
);
INSERT INTO customer (cust_name, balance, create_date, status)
VALUES ('张三', 5000.00, TODAY, 'A');
INSERT INTO customer (cust_name, balance, status) VALUES  ('李四', 3000.00, 'A'), ('王五', 8000.00, 'A'),('赵六', 1500.00, 'I');
    
select * from customer;
select * from receipts;

2、执行以下语句,在事务中进行插入、更新操作

BEGIN WORK;
INSERT INTO receipts VALUES ('cust1', 10);
INSERT INTO receipt VALUES ('cust1', 20);
INSERT INTO receipts VALUES ('cust1', 30);
UPDATE customer  SET status =   'B';   
COMMIT WORK;

 

如果将 DBACCNOIGN 设置为 1,在执行第二条语句(表名拼写错误:receipt 表不存在)时,会直接报错。并退出dbaccess会话。

 

3、重新进入库,查看receipt 表没有数据,之前的insert 被回滚 :


设置  DBACCNOIGN 环境变量后,如执行语句有错误,它会直接退出会话。所以不建议设置DBACCNOIGN 环境变量。

以上可见,GBase 8s 的DBACCNOIGN  环境变量 ,未设置该变量时,错误发生前已执行的 SQL 语句会被提交;而设置  DBACCNOIGN=1  时,发生错误会自动回滚整个未完成的事务。根据实际需求选择是否设置此变量,可以更好地控制事务的行为,确保数据的一致性和完整性。

如果在实际应用中遇到任何问题,欢迎随时在社区中提问,我们在这里为你提供支持!

评论

登录后才可以发表评论
用户头像
路路路发表于 5个月前
环境变量DBACCNOIGN
GBase用户31099发表于 5个月前
1
GBase用户31099发表于 5个月前
2
GBase用户31099发表于 5个月前
3
GBase用户19279发表于 5个月前
学习
GBase用户19279发表于 4个月前
学习~
GBase用户19279发表于 4个月前
学习
崔哥发表于 3个月前
楼上黄昏欲望休,玉梯横绝月中钩。芭蕉不展丁香结,同向春风各自愁。东南日出照高楼,楼上离人唱石州。总把春山扫眉黛,不知供得几多愁?
爱笑的眼睛发表于 2个月前
三人行必有我师