返回首页

gbase数据、南大通用产品文档:GBase8sUNIX 和 Linux 上的 Pluggable Authentication Module(PAM)

更新日期:2024年09月11日

在支持 PAM 的 UNIX™ 和 Linux™ 操作系统上,可随同 GBase 8s ODBC Driver 使用
Pluggable Authentication Module(PAM)。
PAM 使得系统管理员能够为不同的应用程序实现不同的认证机制。例如,像 UNIX 登
录程序这样的系统的需求,
可能与访问数据库敏感信息的应用程序不同。
PAM 允许在单
个机器中有多个这样的场景,因为认证服务是附加在应用程序级的。

使用预处理快速插入数据
#include
#include
#include
#include "gbase.h"

#define NUM_INSERT 1000

void main(void)
{
GBASE* gbase=NULL;
GBASE_STMT* stmt;
GBASE_BIND bind[2];

const char* sql_drop_table
= "drop table if exists
g_demo2";
const char* sql_create_table
=
"create
table
g_demo2(id
int,
name varchar(20))";
const char* insert_mode
= "insert into g_demo2(id,
name)values(?, ?)";
int in_id[NUM_INSERT];
char in_name[NUM_INSERT][20];

unsigned int i = 0;
char* host = "192.168.111.96";
char* user = "gbase";
char* passwd = "gbase20110531";
char* db = "test";
int port = 5258;

GBase 8a 程序员手册C API 篇


- 86 -

南大通用数据技术股份有限公司

/*初始化GBASE 结构体*/
if(!(gbase = gbase_init(0)))
{
fprintf(stderr, "不能初始化GBASE 结构体!\n");
exit(1);
}
/*数据库连接*/
if(!gbase_real_connect(gbase, host, user, passwd, db, port,
NULL, 0))
{
fprintf(stderr, "\n%s\n", gbase_error(gbase));
exit(1);

}
gbase->reconnect = 1;
/*在数据库中创建表*/
if(gbase_query(gbase, sql_drop_table))
{
fprintf(stderr, "%s", gbase_error(gbase));
exit(1);
}
if(gbase_query(gbase, sql_create_table))
{
fprintf(stderr, "\n%s\n", gbase_error(gbase));
exit(1);

}
gbase_autocommit(gbase, 0);
/*向数据库表中插入数据*/
for(i=0; i{
in_id[i] = i;
sprintf(in_name[i], "name_%d", i);
}
if(!(stmt = gbase_stmt_init(gbase)))
{
fprintf(stderr, "\n%s\n", gbase_stmt_error(stmt));
exit(1);



GBase 8a 程序员手册C API 篇
南大通用数据技术股份有限公司

- 87 -
}
if(gbase_stmt_prepare(stmt, insert_mode,
strlen(insert_mode)))
{
fprintf(stderr, "\n%s\n", gbase_stmt_error(stmt));
exit(1);
}

memset(bind, 0, sizeof(bind));

bind[0].buffer_type = GBASE_TYPE_LONG;
bind[1].buffer_type = GBASE_TYPE_STRING;

printf("开始插入%d 条数据\n", NUM_INSERT);
for(i=0; i{
bind[0].buffer = (void*)∈_id[i];
bind[1].buffer = (void*)in_name[i];
bind[1].buffer_length = strlen(in_name[i]);

if(gbase_stmt_bind_param(stmt, bind))
{
fprintf(stderr, "\n%s\n", gbase_stmt_error(stmt));
exit(1);
}
if(gbase_stmt_execute(stmt))
{
fprintf(stderr, "\n%s\n", gbase_stmt_error(stmt));
exit(1);
}
}
gbase_commit(gbase);

/*关闭STMT 语句句柄*/
if(gbase_stmt_close(stmt))
{
fprintf(stderr, "%s\n", gbase_stmt_error(stmt));

GBase 8a 程序员手册C API 篇


- 88 -

南大通用数据技术股份有限公司
exit(1);
}
/*释放数据库连接句柄*/
gbase_close(gbase);
}

简单大对象数据(TEXT 和 BYTE 数据类型)可能太多,无法包含在逻辑日志记录中。
如果始终记录简单大对象,它们可能会非常大,以致减缓了逻辑日志。
数据库服务器假设您将数据库设计为较小简单大对象存储在数据库空间中而较大简单大对
象存储在 BLOB 空间中:

对于存储在数据库空间中的简单大对象,数据库服务器将简单大对象数据包含在
日志记录中。

对于存储在 BLOB 空间中的简单大对象,数据库服务器不会将简单大对象数据包
含在日志记录中。仅当您备份逻辑日志时,逻辑日志才记录 BLOB 空间数据。
为了那些对 BLOB 空间中简单大对象执行频繁更新的应用程序能获取更好的整体性能,
可减少逻辑日志的大小。较小日志可改进对必须重新使用的简单大对象的访问。
切换日志文件以激活 BLOB 空间
您必须在以下情况中切换到下一个逻辑日志文件:

在创建 BLOB 空间后,如果您想要立即将简单大对象插入 BLOB 空间

向现有 BLOB 空间添加新块后,如果您要将简单大对象插入到将使用该新块的
BLOB 空间
数据库服务器需要在不同的逻辑日志文件中创建用于创建 BLOB 空间的语句、在 BLOB
空间中创建块的语句,以及将简单大对象插入该 BLOB 空间的语句。此需求与数据库日
志记录状态无关。
有关切换到下一个日志文件的指示信息,请参阅切换到下一个逻辑日志文件。
备份日志文件以释放 BLOB 页
在删除存储在 BLOB 空间页中的数据时,不必为重新使用而释放那些页。仅当以下两个
操作均已发生时,BLOB 空间页是可用的:

通过对列的更新或通过删除行而删除了 TEXT 或 BYTE 数据

备份了存储行(包含 TEXT 或 BYTE 数据)中插入的逻辑日志
插入或删除 TEXT 和 BYTE 数据之前备份 BLOB 空间

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 286 -
请确保备份所有包含有关 BLOB 空间中所存储简单大对象的事务的 BLOB 空间和逻辑
日志。在日志备份期间,数据库服务器在逻辑日志中使用数据指针将更改过的 text 和
byte 数据从 BLOB 空间复制到逻辑日志中。