2

我将 ASP.NET (VB.NET) 与 SQL Server 一起使用,并希望允许用户从 Web 表单创建服务器登录名和数据库用户。

我通过执行创建登录名和用户的命令来完成这项工作:

Dim cmd As New OleDb.OleDbCommand(
    "CREATE LOGIN [" & login & "] FROM WINDOWS WITH DEFAULT_DATABASE = Db; " & _
    "CREATE USER " & username & " FOR LOGIN [" & login & "]; ",
    connection)
cmd.ExecuteNonQuery()

和是我正在清理(尽我所能)并直接插入login到. 虽然这是有效的,但我觉得我不应该这样做。usernameCommandText

我希望有类似于参数化查询的东西,如下所示:

Dim cmd As New OleDb.OleDbCommand(
    "CREATE LOGIN [@login] FROM WINDOWS WITH DEFAULT_DATABASE = Db; " & _
    "CREATE USER @username FOR LOGIN [@login]; ",
    connection)
cmd.Parameters.AddWithValue("@login", login)
cmd.Parameters.AddWithValue("@username", username)
cmd.ExecuteNonQuery()

但是,这不起作用,因为CREATE LOGIN并且CREATE USER似乎不允许参数化值,如podiluska 所述

'@username' 附近的语法不正确。

有没有更好的方法从用户输入创建登录名和用户?

4

2 回答 2

1

您不能参数化CREATE USERandCREATE LOGIN命令。

您可以创建一个使用(已弃用)sp_addlogin和参数的存储过程sp_adduser,但是要创建具有 Windows 登录名的用户,您需要使用CREATE LOGIN动态 SQL,因此需要使用动态 SQL。

于 2012-07-24T19:32:38.717 回答
0

一种可能的选择是使用存储过程,我以前避免使用它,因为它sp_addloginsp_adduser弃用(如podiluska 所述)。

但是,似乎可以在存储过程中使用CREATE LOGIN和,方法是将它们构建在一个带有 的字符串中,这在这个问题中有所描述。然后可以调整问题中包含的参数化查询代码片段以使用存储过程,只需稍作更改:CREATE USEREXEC

cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "sp_storedprocname"
于 2012-07-24T21:44:37.343 回答