我正在使用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
和username
是我正在清理的用户输入(尽我所能)并直接插入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 LOGIN
和CREATE USER
似乎不允许参数化值,如podiluska所述:
'@ username'附近的语法不正确。
是否有更好的方法从用户输入创建登录名和用户?
答案 0 :(得分:1)
您无法参数化CREATE USER
和CREATE LOGIN
命令。
您可以创建一个使用(已弃用)sp_addlogin
和sp_adduser
上的参数的存储过程,但要创建具有Windows登录名的用户,您需要使用CREATE LOGIN
因此动态SQL。
答案 1 :(得分:0)
一种可能的选择是使用存储过程,由于sp_addlogin
和sp_adduser
为deprecated(podiluska所述),我之前已避免使用该存储过程。
但是,似乎可以在存储过程中使用CREATE LOGIN
和CREATE USER
,并在EXEC
的字符串中构建它们,this question中对此进行了描述。然后,可以调整问题中包含的参数化查询代码片段,以使用存储过程进行微小更改:
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "sp_storedprocname"