2012-07-24 92 views
2

我正在使用SQL Server的ASP.NET(VB.NET),并希望允许用户从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”附近的语法不正确。

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

+0

@Jupaol:OP想要创建数据库[登录](http://msdn.microsoft.com/en -us/library/ms189751.aspx),而不是成员用户。 – 2012-07-24 19:32:22

+0

存储过程如何? – 2012-07-24 19:35:13

+0

@WaqarJanjua起初我没有考虑过它,因为'sp_addlogin'已被弃用,并且参数对我无效。感谢您提及它 - 您的评论让我找到[this](http://stackoverflow.com/questions/837358/sql-create-logon-cant-use-parameter-as-username)。 – Zhihao 2012-07-24 21:54:18

回答

0

一个可能的选择是使用存储的过程,我之前避免了由于sp_addloginsp_adduserdeprecated(如podiluska所述)。

然而,似乎可以通过在与EXEC一个字符串,其在this question描述构建他们使用CREATE LOGINCREATE USER在存储过程中。包含在问题中的参数化查询代码片段然后可以适合于使用存储过程有细微的变化:

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

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

您可以创建一个对(不建议使用)sp_addloginsp_adduser使用参数的存储过程,但与Windows登录创建用户,你需要使用CREATE LOGIN,因此动态SQL。