Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net SQL Server 2008中的用户登录失败_.net_Sql Server_Sql Server 2008_C# 4.0 - Fatal编程技术网

.net SQL Server 2008中的用户登录失败

.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

我需要创建一个只能在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 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一样!