返回首页

gbase数据、南大通用产品文档:GBase8s授予和撤销应用程序中的权限

更新日期:2024年09月11日

反复地执行与数据定义相关的一个任务:授予和撤销权限。由于必须频繁地授予和撤销权
限,有可能是由不熟悉 SQL 的用户操作,因此一种策略是将 GRANT 和 REVOKE 语句
打包在程序中,来提供给他们更简单、更方便的用户接口。
GRANT 和 REVOKE 语句特别适合于动态 SQL。每一语句采用下列参数:

一个或多个权限的列表

表名称

用户的名称
您可能至少需要基于程序输入(来自于用户、命令行参数或文件)提供这些值的一部分,
但都不可以主变量的形式提供。这些语句的语法不允许在任何位置使用主变量。
一个替代方案是将语句的各个部分组合到字符串内,并准备和执行组合好的语句。程序输
入可作为字符串合并到准备好的语句内。
下列 GBase 8s ESQL/C 函数从参数组合 GRANT 语句,然后准备和执行它:

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 227 -
char priv_to_grant[100];
char table_name[20];
char user_id[20];

table_grant(priv_to_grant, table_name, user_id)
char *priv_to_grant;
char *table_name;
char *user_id;
{
EXEC SQL BEGIN DECLARE SECTION;
char grant_stmt[200];
EXEC SQL END DECLARE SECTION;

sprintf(grant_stmt, " GRANT %s ON %s TO %s",
priv_to_grant, table_name, user_id);
PREPARE the_grant FROM :grant_stmt;
if(SQLCODE == 0)
EXEC SQL EXECUTE the_grant;
else
printf("Sorry, got error # %d attempting %s",
SQLCODE, grant_stmt);

EXEC SQL FREE the_grant;
}
下列示例展示的该函数的打开语句指定它的名称及其三个参数。这三个参数指定要授予的
权限、对其授予权限的表的名称,以及要接收它们的用户的 ID。
table_grant(priv_to_grant, table_name, user_id)
char *priv_to_grant;
char *table_name;
char *user_id;
该函数使用下例中的语句来定义本地变量 grant_stmt,
使用其来组合并保存 GRANT 语句:

EXEC SQL BEGIN DECLARE SECTION;
char grant_stmt[200];
EXEC SQL END DECLARE SECTION;
如下例所示,通过将该语句的常量部分与函数参数连起来,创建该 GRANT 语句:
sprintf(grant_stmt, " GRANT %s ON %s TO %s",priv_to_grant,

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 228 -
table_name, user_id);
此语句将下列六个字符串连接起来:

'GRANT'

指定要授予的权限的参数

'ON'

指定表名称的参数

'TO'

指定用户的参数
结果是部分由程序输入组成的完整的 GRANT 语句。PREPARE 语句将组合的语句文本传
给数据库服务器进行解析。
如果数据库服务器跟在 PREPARE 语句之后在 SQLCODE 中返回错误代码,则该函数显
示错误消息。如果数据库服务器认可该语句的形式,则它设置零返回值。此活动并不保证
正确地执行该语句;它仅意味着该语句的语法正确。它可能引用不存在的表或某些种类仅
可在执行期间才能检测到的错误。该示例的下列部分在执行之前检查 the_grant 是否准备成
功了:
if(SQLCODE == 0)
EXEC SQL EXECUTE the_grant;
else
printf("Sorry, got error # %d attempting %s", SQLCODE, grant_stmt);
如果准备成功,则 SQLCODE = = 0,下一步执行准备好的语句。

示例1:指定多个字符为换行符。
示例中用到的表及数据:
DROP TABLE IF EXISTS gs;
CREATE TABLE gs (a int DEFAULT NULL, b varchar(20) DEFAULT NULL);
INSERT INTO gs VALUES(3,'nihao');
INSERT INTO gs VALUES(4, 'GBase');
gbase> SELECT * FROM gs INTO OUTFILE '/home/gbase/temp/gs_f.txt' LINES TERMINATED BY
'@#$';
Query OK, 2 rows affected
查看导出文件:
$ cat gs_f.txt
3 nihao@#$4 GBase@#$

复制(SQL 管理 API)
随同 cdr autoconfig serv 参数的 admin() 或 task() 函数可自动配置高可用性集群中
服务器的连接性,且可自动配置复制。
语法

Source options

Target options

元素
目的
约束
host
数据库服务器主机的名称

port
用于通信的端口号

server
要连接到的数据库服务器名
该名称必须是数据库服务器或服务
器连接的名称。
server_group
包括要连接的数据库服务器的数
据库服务器组名
该名称必须是现有的数据库服务器
组名。

下表描述 cdr autoconfig serv 的选项。

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 698 -

长形
短形
含意
--sourcehost
-H
正在发送自动配置信息的数据库服务器的主
机。如果未指定 --sourcehost 和
--sourceport,则将在其上运行函数的数据库
服务器视为源数据库服务器。
--sourceport
-P
正在发送自动配置信息的数据库服务器使用的
端口。
--targethost
-h
正在接收自动配置信息的数据库服务器主机。
--targetport
-p
正在接收自动配置信息的数据库服务器使用的
端口。

用法
运行带有 cdr autoconfig serv 参数的 admin() 或 task() 函数可自动配置高可用性集
群或 Enterprise Replication 域中服务器的连接性,如果您正在添加数据库服务器到
Enterprise
Replication 域,
则还可自动配置复制。
在您可运行带有 cdr
autoconfig
serv
参数的 admin() 或 task() 函数之前,CDR_AUTO_DISCOVER 配置参数必须在参与
Enterprise Replication 域的所有数据库上设置为 1。通过 cdr autoconfig serv 添加
到 Enterprise Replication 域的新安装的数据库服务器必须有一个配置的存储池。
如果已为 Enterprise Replication 配置了源服务器,则函数执行下列活动:
1. 源服务器将其可信任主机文件传到目的服务器。
2. 目的服务器为自身和所有其他复制服务器添加条目到其 sqlhosts 文件。
3. 源服务器以目的服务器的条目更新其 sqlhost 文件。
4. 每一复制服务器以目的服务器的条目更新其 sqlhost 文件和可信任主机文件。
5. 目的数据库设置其 CDR_DBSPACE 配置参数并创建 Enterprise Replication 要求
的 dbspace。
6. 目的服务器设置其 CDR_QDATA_SBSPACE 配置参数并创建 Enterprise Replication
要求的 sbspace。
7. 在目的服务器上创建中止事务 spooling(ATS)文件目录
$GBS_HOME/tmp/ats_dbservername。
8. 在目的服务器上创建行信息 spooling(RIS)文件目录
$GBS_HOME/tmp/ris_dbservername。
9. 启动到目的服务器的复制。

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 699 -

如果未为 Enterprise Replication 配置源服务器,则函数执行附加的活动:
1. 源服务器为自身添加条目到其 sqlhosts 文件。
2. 源服务器设置其 CDR_DBSPACE 配置参数并创建 Enterprise Replication 要求的
dbspace。
3. 源服务器设置其 CDR_QDATA_SBSPACE 配置参数并创建 Enterprise Replication
要求的 sbspace。
4. 在源服务器上创建中止事务 spooling(ATS)文件目录
$GBS_HOME/tmp/ats_dbservername。
5. 在源服务器上创建行信息 spooling(RIS)文件目录
$GBS_HOME/tmp/ris_dbservername。
6. 在开始目的服务器上的复制之前,开始源服务器上的复制。
对带有 cdr autoconfig serv 参数的 admin() 或 task() 函数使用下列约束:
l 所有复制服务器必须是活动的,否则函数失败。
l 如果您已经手工地配置了可信任主机信息,而不是通过运行带有 cdr add
trustedhost 参数的 admin() 或 task() 函数配置的,则请不要运行带有 cdr
autoconfig serv 参数的 admin() 或 task() 函数。
l 如果您的复制服务器有配置的安全端口,则请不要运行带有 cdr autoconfig serv
参数的 admin() 或 task() 函数。
l 带有 cdr autoconfig serv 参数的 admin() or task() 函数不复制 hosts.equiv
信息到可信任主机文件,该文件由 REMOTE_SERVER_CFG 配置参数设置。如果您必
须从 hosts.equiv 文件添加信息到 REMOTE_SERVER_CFG 配置参数设置的可信任
主机文件,请运行带有 cdr add trustedhost 参数的 admin() 或 task() 函数。

串行地配置数据库服务器。不支持并行配置。
您可如 cdr utility 命令那样运行这个函数。
示例 1:在本地服务器上配置 Enterprise Replication
对于这个示例,您有一个未为 Enterprise Replication 配置的本地数据库服务器:
在本地服务器上运行下列任务函数:
EXECUTE FUNCTION task('cdr autoconfig server');
该任务函数在本地服务器上配置 Enterprise Replication。
示例 2:通过使用源语法在两独立服务器之间配置连接性和 ER
对于这个示例,您有两数据库服务器:
为 Enterprise Replication 配置 host_1 上的 server_1
未为 Enterprise Replication 配置 host_2 上的 server_2
EXECUTE FUNCTION task('cdr autoconfig server', '--connect server_2

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 700 -

--sourcehost host_1 --sourceport 9020');
该任务函数执行下列活动:
该命令连接到 server_2。
在 server_2 上定义 Enterprise Replication。
server_1 复制其数据到 server_2
示例 3:使用目的语法配置两独立服务器之间的连接性和 ER
下列命令
EXECUTE FUNCTION task('cdr autoconfig server', '--connect server_1
-–targethost host_2 --targetport 9030');
该任务函数执行下列活动:
1. 该命令连接到 server_1。
2. 在 server_2 上定义 Enterprise Replication。
3. server_1 复制其数据到 server_2