.net SQL Server 2008中的用户登录失败
我需要创建一个只能在SQL Server中执行存储过程的用户。我使用这个查询.net SQL Server 2008中的用户登录失败,.net,sql-server,sql-server-2008,c#-4.0,.net,Sql Server,Sql Server 2008,C# 4.0,我需要创建一个只能在SQL Server中执行存储过程的用户。我使用这个查询 CREATE LOGIN SLogin WITH PASSWORD=N'#######', DEFAULT_DATABASE=MyDB, CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF CREATE USER SUser FOR LOGIN [SLogin] WITH DEFAULT_SCHEMA = MyDB CREATE ROLE SUserRole AUTHORIZATION
CREATE LOGIN SLogin WITH PASSWORD=N'#######', DEFAULT_DATABASE=MyDB, CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
CREATE USER SUser FOR LOGIN [SLogin]
WITH DEFAULT_SCHEMA = MyDB
CREATE ROLE SUserRole AUTHORIZATION SUser
GRANT SELECT, INSERT, ALTER, EXECUTE TO SUserRole
问题是,当我尝试使用SSMS和SUser登录时,会收到一条错误消息“用户登录失败”,错误代码18456。但我可以使用SLogin和密码登录
当我试图从C执行存储过程时,如果我使用这个连接字符串数据源=##############MSSQLSERVER,1433;初始目录=MyDB;用户ID=SLogin;密码=#######代码>
我可以打开连接,但无法执行存储过程。它表示用户无权访问此模式
在连接字符串中,如果我使用SUser作为用户ID,则无法打开连接
请帮助我找出我做错的地方。1-从master开始并创建登录名。在本例中,我希望它们默认为[BSA]数据库
-- Which database to use.
USE [master]
GO
-- Delete existing login.
IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'BSA_ADMIN')
DROP LOGIN [BSA_ADMIN]
GO
-- Add new login.
CREATE LOGIN [BSA_ADMIN] WITH PASSWORD=N'M0a2r0c9h11$',
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF, DEFAULT_DATABASE=[BSA];
GO
2-切换到数据库[BSA]并创建用户。在本例中,我希望它们的默认模式为[DBO],并映射到上述登录
-- Which database to use.
USE [BSA]
GO
-- Delete existing user.
IF EXISTS (SELECT * FROM sys.database_principals WHERE name = N'BSA_ADMIN')
DROP USER [BSA_ADMIN]
GO
-- Add new user.
CREATE USER [BSA_ADMIN] FOR LOGIN [BSA_ADMIN] WITH DEFAULT_SCHEMA=[DBO]
GO
3-接下来,创建任何角色并将用户添加到角色中。在本例中,用户被添加到db_owner
-- Which database to use.
USE [BSA]
GO
-- Add to database owner role
EXEC sp_addrolemember 'db_owner', 'BSA_ADMIN'
GO
您可能会收到错误,因为登录名默认为[master]。这种情况经常发生在新的DBA身上
4-在您的案例中,您可以选择创建一个自定义角色,并赋予该模式的角色所有权
下面的代码是我做的一个演示。只需对您的环境进行必要的更改
-- Make sure we are in autos
USE [AUTOS]
GO
-- Delete existing role.
IF EXISTS (SELECT * FROM sys.database_principals
WHERE type_desc = 'DATABASE_ROLE' AND name = 'AUTO_ROLE')
DROP ROLE [AUTO_ROLE]
GO
-- Create application role
CREATE ROLE [AUTO_ROLE] AUTHORIZATION [dbo]
GO
-- Apply permissions to schemas
GRANT ALTER ON SCHEMA::[ACTIVE] TO [AUTO_ROLE]
GO
GRANT CONTROL ON SCHEMA::[ACTIVE] TO [AUTO_ROLE]
GO
GRANT SELECT ON SCHEMA::[ACTIVE] TO [AUTO_ROLE]
GO
-- Ensure role membership is correct
EXEC sp_addrolemember N'AUTO_ROLE', N'AUTO_USER'
GO
1-在master中启动并创建登录名。在本例中,我希望它们默认为[BSA]数据库
-- Which database to use.
USE [master]
GO
-- Delete existing login.
IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'BSA_ADMIN')
DROP LOGIN [BSA_ADMIN]
GO
-- Add new login.
CREATE LOGIN [BSA_ADMIN] WITH PASSWORD=N'M0a2r0c9h11$',
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF, DEFAULT_DATABASE=[BSA];
GO
2-切换到数据库[BSA]并创建用户。在本例中,我希望它们的默认模式为[DBO],并映射到上述登录
-- Which database to use.
USE [BSA]
GO
-- Delete existing user.
IF EXISTS (SELECT * FROM sys.database_principals WHERE name = N'BSA_ADMIN')
DROP USER [BSA_ADMIN]
GO
-- Add new user.
CREATE USER [BSA_ADMIN] FOR LOGIN [BSA_ADMIN] WITH DEFAULT_SCHEMA=[DBO]
GO
3-接下来,创建任何角色并将用户添加到角色中。在本例中,用户被添加到db_owner
-- Which database to use.
USE [BSA]
GO
-- Add to database owner role
EXEC sp_addrolemember 'db_owner', 'BSA_ADMIN'
GO
您可能会收到错误,因为登录名默认为[master]。这种情况经常发生在新的DBA身上
4-在您的案例中,您可以选择创建一个自定义角色,并赋予该模式的角色所有权
下面的代码是我做的一个演示。只需对您的环境进行必要的更改
-- Make sure we are in autos
USE [AUTOS]
GO
-- Delete existing role.
IF EXISTS (SELECT * FROM sys.database_principals
WHERE type_desc = 'DATABASE_ROLE' AND name = 'AUTO_ROLE')
DROP ROLE [AUTO_ROLE]
GO
-- Create application role
CREATE ROLE [AUTO_ROLE] AUTHORIZATION [dbo]
GO
-- Apply permissions to schemas
GRANT ALTER ON SCHEMA::[ACTIVE] TO [AUTO_ROLE]
GO
GRANT CONTROL ON SCHEMA::[ACTIVE] TO [AUTO_ROLE]
GO
GRANT SELECT ON SCHEMA::[ACTIVE] TO [AUTO_ROLE]
GO
-- Ensure role membership is correct
EXEC sp_addrolemember N'AUTO_ROLE', N'AUTO_USER'
GO
最后我总算成功了。我的最后一个问题是
USE [MyDB]
GO
CREATE LOGIN [SLogin] WITH PASSWORD=N'#####', DEFAULT_DATABASE=[MyDB], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
CREATE USER SUser FOR LOGIN [SLogin]
WITH DEFAULT_SCHEMA = [MyDB]
CREATE ROLE SUserRole AUTHORIZATION SUser
GRANT SELECT, INSERT,EXEC, ALTER TO SurveyUserRole
ALTER ROLE [SUserRole] ADD MEMBER [SUser]
但是我很困惑
CREATE ROLE SUserRole AUTHORIZATION SUser
此查询应创建角色,并将此角色分配给用户。为什么我需要再次将用户添加到此角色
有人能解释这种行为吗?最后,我总算成功了。我的最后一个问题是
USE [MyDB]
GO
CREATE LOGIN [SLogin] WITH PASSWORD=N'#####', DEFAULT_DATABASE=[MyDB], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
CREATE USER SUser FOR LOGIN [SLogin]
WITH DEFAULT_SCHEMA = [MyDB]
CREATE ROLE SUserRole AUTHORIZATION SUser
GRANT SELECT, INSERT,EXEC, ALTER TO SurveyUserRole
ALTER ROLE [SUserRole] ADD MEMBER [SUser]
但是我很困惑
CREATE ROLE SUserRole AUTHORIZATION SUser
此查询应创建角色,并将此角色分配给用户。为什么我需要再次将用户添加到此角色
有人能解释这种行为吗?没有,它没有解决问题。使用登录,我可以建立连接,但无法执行SP。使用用户,我无法打开连接。显式向SP添加角色权限。此外,通过SSMS测试安全性,通过标准安全性登录。打开一个新的查询窗口并尝试执行SP。不,它没有解决问题。使用登录,我可以建立连接,但无法执行SP。使用用户,我无法打开连接。显式向SP添加角色权限。此外,通过SSMS测试安全性,通过标准安全性登录。打开一个新的查询窗口并尝试执行SP。我通常先保留[dbo],然后保留SP_addrolemember,与添加成员相同!我通常会先留下[dbo]然后留下sp_addrolemember,和ADD MEMBER一样!