无法使用execBatch在Hana数据库中创建用户

问题描述

我有一个XSA系统和XSA数据库用户。该XSA DB用户将用于在XSA中创建新的Hana数据库用户。我正在尝试通过execBatch()功能创建一批用户我有一个node.js项目的上限。

我正在我的node.js文件中执行SQL查询。下面是代码-

console.log("targeting User Creation")
try{
       let createuserstatement = await xsaDbConn.preparePromisified("CREATE USER ? PASSWORD AbcYes NO FORCE_FirsT_PASSWORD_CHANGE")
       await createuserstatement.execBatch(createusersarr)
       console.log(`Users created.`) 
}catch(err){
       console.log(err.stack)
}

createusersarr是包含要创建的用户列表的数组。数组看起来像这样-

[ [ 'SAC_XSA_HDB_USER_ABC1' ],[ 'SAC_XSA_HDB_USER_ABC2' ],[ 'SAC_XSA_HDB_USER_ABC3' ],[ 'SAC_XSA_HDB_USER_ABC4' ],[ 'SAC_XSA_HDB_USER_ABC5' ],[ 'SAC_XSA_HDB_USER_ABC6' ],[ 'SAC_XSA_HDB_USER_ABC7' ],[ 'SAC_XSA_HDB_USER_ABC8' ],[ 'SAC_XSA_HDB_USER_ABC9' ],[ 'SAC_XSA_HDB_USER_ABC10' ] ]

当我运行节点应用程序时,

它不会创建用户,并且显示错误未定义,如下所示-

ERROR - targeting User Creation

undefined

我不确定为什么会失败?当我使用exec()而不是execBatch()并在创建用户查询(基本循环机制)中一一提供用户名时,它运行良好。

解决方法

要解决该问题,可以使用HANA Studio或XSA SQL控制台来查看该语句CREATE USER ? PASSWORD "qwe"不能使用占位符。这里的用户名是一个对象,占位符仅是参数,它们不能替代对象名。

我没有找到doc链接(这是SAP,所以并不感到惊讶),但是在其他数据库中却可以这样工作。

编辑: “对象”是指在数据库系统表中保留的东西:表,视图,序列,功能,用户,角色,特权等。它是模型或系统的一部分,您可以“使用” ”(调用,选择,创建,更改等)。它是语法的一部分(在文档中可以找到它)。数据是您可以操纵的内容,并且可以用占位符代替。当然,元数据也存储在某个地方,但这是另一个抽象层次。

要使您的用户名成为数据,您应该编写一些过程来获取用户名,创建SQL语句并用EXECUTE IMMEDIATE发出该语句(因此它要求SQL解析器按原样解析整个字符串)。然后,您应该使用?作为用户名参数,并传递要创建的动态用户名。

create procedure p_create_user( in p_uname nvarchar(20))
language sqlscript
sql security invoker
as
begin
  declare lv_sql nvarchar(1000);
  lv_sql := replace('create user <uname> password "QWEasd!23"','<uname>',p_uname);
  execute immediate lv_sql;
end;

call p_create_user('demo');