无法使用 execBatch() 在 Hana 数据库中创建用户
Unable to create users in Hana Database Using execBatch()
我有一个 XSA 系统和 XSA 数据库用户。此 XSA 数据库用户将用于在 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"
不能使用占位符。这里的用户名是对象,占位符只是参数,不能代替对象名。
我没有找到文档 link(这是 SAP,所以并不奇怪),但它在其他数据库中是这样工作的。
编辑:
“对象”是指在数据库系统 tables 中持久存在的东西:table、视图、序列、函数、用户、角色、特权等。它是一个实体,它是模型的一部分或一部分系统的一部分,您可以“使用”(调用、select、创建、更改等)。它是语法的一部分(在您可以找到的文档中)。数据是您可以操作的内容,可以用占位符代替。当然,元数据也存储在某个地方,但它是另一个抽象级别。
为了使您的用户名成为数据,您应该编写一些过程,它接受一个用户名,创建 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');
我有一个 XSA 系统和 XSA 数据库用户。此 XSA 数据库用户将用于在 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"
不能使用占位符。这里的用户名是对象,占位符只是参数,不能代替对象名。
我没有找到文档 link(这是 SAP,所以并不奇怪),但它在其他数据库中是这样工作的。
编辑: “对象”是指在数据库系统 tables 中持久存在的东西:table、视图、序列、函数、用户、角色、特权等。它是一个实体,它是模型的一部分或一部分系统的一部分,您可以“使用”(调用、select、创建、更改等)。它是语法的一部分(在您可以找到的文档中)。数据是您可以操作的内容,可以用占位符代替。当然,元数据也存储在某个地方,但它是另一个抽象级别。
为了使您的用户名成为数据,您应该编写一些过程,它接受一个用户名,创建 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');