我正在使用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
似乎不允许参数化值,正如podiulska:所提到的那样
"@username"附近的语法不正确。
有没有更好的方法从用户输入创建登录和用户?
不能参数化CREATE USER
和CREATE LOGIN
命令。
您可以创建一个存储过程,该过程使用(不推荐使用的)sp_addlogin
和sp_adduser
上的参数,但要使用windows登录创建用户,您需要使用CREATE LOGIN
,因此需要使用动态SQL。
一个可能的选项是使用存储过程,由于sp_addlogin
和sp_adduser
被弃用(正如podilska所提到的),我以前曾避免使用存储过程。
然而,似乎可以在存储过程中使用CREATE LOGIN
和CREATE USER
,方法是使用EXEC
将它们构建在字符串中,这将在本问题中进行描述。然后,问题中包含的参数化查询代码片段可以进行调整,以使用经过微小更改的存储过程:
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "sp_storedprocname"