| GBase 8s SQL 指南:教程 / SQL 编程 | |
反复地执行与数据定义相关的一个任务:授予和撤销权限。由于必须频繁地授予和撤销权限,有可能是由不熟悉 SQL 的用户操作,因此一种策略是将 GRANT 和 REVOKE 语句打包在程序中,来提供给他们更简单、更方便的用户接口。
您可能至少需要基于程序输入(来自于用户、命令行参数或文件)提供这些值的一部分,但都不可以主变量的形式提供。这些语句的语法不允许在任何位置使用主变量。
一个替代方案是将语句的各个部分组合到字符串内,并准备和执行组合好的语句。程序输入可作为字符串合并到准备好的语句内。
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;
}
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);
结果是部分由程序输入组成的完整的 GRANT 语句。PREPARE 语句将组合的语句文本传给数据库服务器进行解析。
if(SQLCODE == 0)
EXEC SQL EXECUTE the_grant;
else
printf("Sorry, got error # %d attempting %s", SQLCODE, grant_stmt);
如果准备成功,则 SQLCODE = = 0,下一步执行准备好的语句。