2013-12-12 152 views
0

我需要创建一个只能在SQL Server中执行存储过程的用户。我用这个查询SQL Server 2008用户登录失败

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 

的问题是,当我尝试使用带有的suser SSMS我得到一个错误消息“用户登录失败”错误代码18456.登录,但我可以登录使用s登录和密码。

当我尝试从C#执行存储过程,如果我用这个连接字符串Data Source=############\MSSQLSERVER,1433;Initial Catalog=MyDB;User ID=SLogin;Password=######;

我能够打开连接,但无法执行该存储过程。它表示用户无权访问此架构。

而在连接字符串中,如果我使用SUser作为用户ID,则无法打开连接。

请帮我看看我做错了什么。

回答

1

1 - 从主控开始并创建登录。在这个例子中,我希望它们默认为[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 
+0

不,它没有解决问题。通过登录,我可以建立连接但不能执行SP。用户我无法打开连接。 – Gulshan

+0

将角色的权限显式添加到SP。另外,通过SSMS测试安全性,通过标准安全性登录。打开一个新的查询窗口并尝试执行SP。 –

0

最后我以某种方式得到它的工作。我最后的查询是

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 

这个查询应该创建角色,也将此角色分配给用户。为什么我需要再次将用户添加到此角色。

任何人都可以解释这种行为

+0

我通常会离开那个[dbo],然后是sp_addrolemember,和ADD MEMBER一样! –

相关问题