尝试创建数据库,用户和登录的动态SQL语句出错

时间:2018-11-08 18:14:59

标签: sql sql-server ssms

我正在尝试创建一个存储过程,该存储过程: 1.创建一个数据库 2.创建一个登录名 3.创建一个用户 4.为用户分配登录名 5.设置登录SA(sysadmin角色)

我正在尝试使用3个参数创建此存储过程。第一个参数是登录名。第二个参数是用户名。第三个参数是登录密码。 (数据库名与用户名相同)当我只有两个参数时,用户名和密码(数据库名和登录名与用户名相同)可以正常工作而不会出现任何错误。

USE []
GO
/****** Object:  StoredProcedure [dbo].[spCreateDatabases]    Script Date: 11/8/2018 1:54:09 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[spCreateDatabaseWithSAUserAndLoginx]
    @userID varchar(50),
    @password varchar(10)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @newdb sysname
    DECLARE @SQL NVARCHAR(4000)
    SET @newdb = @userID
    PRINT @UserID
    EXEC('CREATE DATABASE ' + @newdb)
END
BEGIN
    -- Create the user name
    SET @SQL = 'USE ' + @newdb + ';' + 'CREATE LOGIN ' + @userID + ' WITH PASSWORD = ''' + @password + '''; ' + 
    'CREATE USER ' + @userID + ' FOR LOGIN ' + @userID + '; ' + 'ALTER SERVER ROLE sysadmin ADD MEMBER ' + @userID + ';'         
    EXECUTE(@SQL);
END

但是,当我添加新参数时,它会给我错误消息:无法添加服务器主体'',因为它不存在或您没有权限。

USE []
GO
/****** Object:  StoredProcedure [dbo].[spCreateDatabases]    Script Date: 11/8/2018 1:54:09 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[spCreateDatabaseWithSAUserAndLoginx]
    @userID varchar(50),
    @login varchar (50),
    @password varchar(10)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @newdb sysname
    DECLARE @SQL NVARCHAR(4000)
    SET @newdb = @userID
    EXEC('CREATE DATABASE ' + @newdb)
END
BEGIN
    -- Create the user name
    SET @SQL = 'USE ' + @newdb + ';' + 'CREATE LOGIN ' + @login + ' WITH PASSWORD = ''' + @password + '''; ' + 
    'CREATE USER ' + @userID + ' FOR LOGIN ' + @login + '; ' + 'ALTER SERVER ROLE sysadmin ADD MEMBER ' + @userID + ';'         
    EXECUTE(@SQL);
END

1 个答案:

答案 0 :(得分:0)

对于ALTER SERVER ROLE xxx ADD MEMBER,使用@login代替@userid

...

  

ADD MEMBER server_principal将指定的服务器主体添加到   服务器角色。 server_principal可以是登录名或用户定义的服务器   角色。 server_principal不能是固定服务器角色,数据库角色,   或sa。