我正在尝试创建一个存储过程,该存储过程: 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
答案 0 :(得分:0)
对于ALTER SERVER ROLE xxx ADD MEMBER
,使用@login代替@userid
...
ADD MEMBER server_principal将指定的服务器主体添加到 服务器角色。 server_principal可以是登录名或用户定义的服务器 角色。 server_principal不能是固定服务器角色,数据库角色, 或sa。