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

时间:2012-07-24 19:20:47

标签: asp.net sql-server vb.net user-input

我正在使用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似乎不允许参数化值,如podiluska所述:

  

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

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

2 个答案:

答案 0 :(得分:1)

您无法参数化CREATE USERCREATE LOGIN命令。

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

答案 1 :(得分:0)

一种可能的选择是使用存储过程,由于sp_addloginsp_adduserdeprecatedpodiluska所述),我之前已避免使用该存储过程。

但是,似乎可以在存储过程中使用CREATE LOGINCREATE USER,并在EXEC的字符串中构建它们,this question中对此进行了描述。然后,可以调整问题中包含的参数化查询代码片段,以使用存储过程进行微小更改:

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