根据用户输入创建数据库登录名和用户



我正在使用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()

loginusername是我正在清理(尽我所能)并直接插入到CommandText中的用户输入。虽然这是有效的,但我觉得我不应该这样做。

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

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 LOGINCREATE USER似乎不允许参数化值,正如podiulska:所提到的那样

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

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

不能参数化CREATE USERCREATE LOGIN命令。

您可以创建一个存储过程,该过程使用(不推荐使用的)sp_addloginsp_adduser上的参数,但要使用windows登录创建用户,您需要使用CREATE LOGIN,因此需要使用动态SQL。

一个可能的选项是使用存储过程,由于sp_addloginsp_adduser被弃用(正如podilska所提到的),我以前曾避免使用存储过程。

然而,似乎可以在存储过程中使用CREATE LOGINCREATE USER,方法是使用EXEC将它们构建在字符串中,这将在本问题中进行描述。然后,问题中包含的参数化查询代码片段可以进行调整,以使用经过微小更改的存储过程:

cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "sp_storedprocname"

相关内容

  • 没有找到相关文章

最新更新