我正在尝试创建一个存储过程来创建登录和数据库用户?

时间:2012-06-07 11:13:23

标签: sql sql-server sql-server-2008 stored-procedures

我正在使用SQL Server开发一个C#应用程序,并希望调用存储过程来创建登录和用户。

我正在寻找最简单的方法,只是默认的东西,但有用户名和密码。

登录旁边的创建带有红色下划线?

但我觉得我的登录很好吗?请告诉我,如果我遗失了什么。

使用创建用户,它只是一个像这样的单线程吗?

CREATE PROCEDURE CreateLoginAndUser 
       @UserName

   CREATE LOGIN @UserName 
   WITH PASSWORD = 'password', 
        DEFAULT_DATABASE = [TestAudit],
        DEFAULT_LANGUAGE = [British],
        CHECK_EXPIRATION=OFF,
        CHECK_POLICY=ON;

   CREATE USER 'DEV' + @UserName 
       [{ FOR | FROM } LOGIN @UserName] [WITH DEFAULT_SCHEMA = schema]

我不理解FORFROM ...

我可以这样做:

CREATE PROCEDURE CreateLoginAndUser
     @UserName

    CREATE LOGIN @UserName  
    WITH PASSWORD = 'password', 
         DEFAULT_SCHEMA = schema    

    CREATE USER 'DEV'+@UserName 
       [{ FOR | FROM } LOGIN @UserName] [WITH DEFAULT_SCHEMA = schema]

如何使用Google搜索以下来源:

http://ss64.com/sql/login_c.html

http://ss64.com/sql/user_c.html

4 个答案:

答案 0 :(得分:3)

考虑使用动态SQL来创建用户。例如,使用名为@login的数据库用户创建名为'DEV' + @login的服务器登录名:

create procedure dbo.CreateLoginAndUser(
        @login varchar(100),
        @password varchar(100),
        @db varchar(100))
as
declare @safe_login varchar(200)
declare @safe_password varchar(200)
declare @safe_db varchar(200)
set @safe_login = replace(@login,'''', '''''')
set @safe_password = replace(@password,'''', '''''')
set @safe_db = replace(@db,'''', '''''')

declare @sql nvarchar(max)
set @sql = 'use ' + @safe_db + ';' +
           'create login ' + @safe_login + 
               ' with password = ''' + @safe_password + '''; ' +
           'create user DEV' + @safe_login + ' from login ' + @safe_login + ';'
exec (@sql)
go

构造客户端的SQL语句可能更容易。但即便如此,您也无法在create login语句中使用参数。所以要警惕SQL注入。

答案 1 :(得分:1)

{FOR | FROM}表示你可以使用或来自。

| (竖线)=用括号或大括号括起来的语法项。您只能使用其中一项。

编辑:

我应该补充一点,他们是同义词,你可以使用其中的任何一个,结果是相同的

答案 2 :(得分:0)

您应该考虑用户权限。要创建SQL Server登录和数据库用户,您必须具有SQL Server实例的高权限。因此,您必须授予用户执行操作的权限(以及意味着服务器级别和数据库控制权限),或者您必须使用其他机制来不使您的服务器易受攻击。

其中一个选项是使用证书和signet存储过程来“很好地”执行操作,而不允许直接创建登录/用户。

此外,能够使用跟踪的人将能够看到密码(如果您没有在程序中包装密码,则密码不会显示在跟踪中)。

答案 3 :(得分:0)

这是一个关于如何为服务器范围创建登录名以及db的用户的示例 使其适应程序

USE [master]
GO
CREATE LOGIN [usr] WITH PASSWORD=N'pass', DEFAULT_DATABASE=[yourDb], DEFAULT_LANGUAGE=[English], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO

USE [yourDb]
GO
CREATE USER [usr] FOR LOGIN ['usr]
GO

你只需要接收usr和密码作为参数并使用它