개체 'xxxxxxx', 데이터베이스 'zzzzzzz', 스키마 'dbo'에 대한 EXECUTE 권한이 거부되었습니다.


187

함수를 실행하는 데 문제가 있습니다.

내가 한 일은 다음과 같습니다.

  1. SQL Server Management Studio를 사용하여 함수를 만듭니다. 성공적으로 작성되었습니다.
  2. 그런 다음 새로 생성 된 기능을 실행하려고 시도했으며 여기에 내가 얻은 것이 있습니다.

개체 'xxxxxxx', 데이터베이스 'zzzzzzz', 스키마 'dbo'에 대한 EXECUTE 권한이 거부되었습니다.


db_owner 역할이있는 경우 사용자는 다음을 실행할 수도 있습니다 (실행 권한 부여와 동일하지 않음)
hazjack

SQL 문에 구문 오류가있을 때이 오류가 발생했습니다. 기본적으로 내가 합병했다 GOCreateGOCreate. 다른 구문 오류도이 오류를 발생시키는 것으로 보입니다.
Ganesh Kamath- '코드 열풍'

답변:


163

해당 저장 프로 시저에 대해 사용자 (또는 그룹이 속한 그룹)에 실행 권한을 부여해야하는 것처럼 들립니다.

예를 들어, 당신은 할 수 따라서 액세스 권한을 부여 :

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC

2
안녕하세요, 조금 전에 알고 있지만 질문이 있습니다. 이러한 조치에 보안 문제가있을 수 있습니까? 모든 사람에게 사용되도록 sp를 열었습니까?
Valentyn Vynogradskiy

9
예, DB에 연결된 모든 사람이 저장 프로 시저를 실행할 수 있습니다. 보안이 걱정되는 사람들 데이터베이스관련 그룹에 액세스 권한을 부여 할 것으로 기대 합니다 .
Rowland Shaw

7
당신은 또한 사용할 수있는 GRANT EXEC TO PUBLIC데이터베이스의 객체 모두에게 액세스 권한을 부여
sohaiby

2
공개 역할에 실행 권한을 부여하지 않습니다. 우리 환경에서 어떤 방식 으로든 공공 역할이 비활성화되어야했습니다. 항상 특정 사용자 또는이 목적을 위해 명시 적으로 생성 된 역할에 실행 권한을 부여합니다.
user1161391

4
왜 모든 사람들이 데이터베이스에서 무엇인가를 실행할 수있는 PUBLIC 권한을 제안하는 의견을지지하는 이유는 무엇입니까? 그것은 사실이 아닌 특별한 경우입니다.
토 티루

111

내가 찾은 최고의 솔루션은 새로운 데이터베이스 역할을 만드는 것입니다.

CREATE ROLE db_executor;

그런 다음 해당 역할 실행 권한을 부여하십시오.

GRANT EXECUTE TO db_executor;

이제 사용자의 속성으로 이동하여 사용자 매핑으로 이동하여 새 역할을 추가 한 데이터베이스를 선택하면 다음에 대한 데이터베이스 역할 멤버 자격에 새 역할이 표시됩니다.

자세한 내용은 전체 기사를 읽으십시오


8
이 답변은 public 또는 db_owner를 사용하지 않고 모든 SP에 대해 EXECUTE를 특정 사용자 로그인에 부여해야하는 경우에 가장 적합합니다. 여기에 가장 신중하고 유용한 답변 인 것 같습니다.
jcollum

1
어떤 이유로 이것은 SQL Server 2012에서 저에게 적합한 유일한 답변입니다. 사용자에게 명시적인 EXECUTE 권한을 부여해도 작동하지 않습니다. 역할을 통해 권한을 상속받은 경우에만 작동합니다.
Keith

1
이것이 답이되어야합니다. 그것은 나를 위해 매력처럼 작동했습니다. 고마워요!
Shahbaaz

그런 다음EXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan

72

Sql Server Management Studio에서 :

로 이동하십시오 security->schema->dbo.

dbo를 두 번 클릭 한 다음을 클릭 하고 사용 또는 제어 선택을 permission tab->(blue font)view database permission위한 "execute".도움말 과 같은 필수 필드를 자유롭게 스크롤 하십시오 . 이것이 도움이되기를 바랍니다 :)grantdeny


52

이런 식으로 실행해야합니다

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]

4
이것이 내가 필요한 것이었지만, [domain\user]오히려 해야했다'domain\user'
Paul Stephenson

45

사용자 또는 역할에 권한을 부여하려는 경우 작동합니다.

Microsoft SQL Server Management Studio 사용 :

  1. 이동 : 데이터베이스
  2. dbo.my_database를 마우스 오른쪽 버튼으로 클릭하십시오.
  3. 선택 : 속성
  4. 왼쪽 패널에서 다음을 클릭하십시오. 권한
  5. 이름 패널에서 사용자 또는 역할을 선택하십시오.
  6. 권한 및 확인 표시에서 실행 찾기 : Grant, With Grant 또는 Deny

불행히도, 사용자는 이미 실행 권한을 가지고 있습니다! 이것이 혼란스러운 이유입니다.
Douglas Gaskell

내가 그랜트 체크 표시 할 때 덕분에 완벽하게이 작업됩니다 KEIM
로시

16

특히 웹 응용 프로그램에서 동일한 사용자 이름을 사용하는 경우 이러한 권한을 부여하는 것은 위험 할 수 있습니다.

이제 웹 사용자 (및 전 세계 웹)도 데이터베이스 내에서 객체를 생성하고 삭제할 수있는 권한이 있습니다. SQL 인젝션을 생각하십시오!

다음과 같이 지정된 객체의 특정 사용자에게만 실행 권한을 부여하는 것이 좋습니다.

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

이제 사용자 myusernameNoquotes는 중요한 데이터에 대한 다른 불필요한 권한없이 storedProcedureNameNoquotes 프로 시저를 실행할 수 있습니다.



3

솔루션을 실행할 때 발생하는 예외와 관련하여 위의 질문과 같은 문제가있는 경우 문제는 해당 그룹의 사용자에게 데이터베이스 / 저장 프로 시저에 액세스 할 수있는 권한이 아닌 권한입니다. 데이터베이스 이름, 저장 프로 시저 (함수) 및 권한 유형 또는 역할 또는 액세스 권한을 부여한 사람으로 내 것을 대신하여 아래에있는 것과 같은 작업을 수행하면됩니다.

USE [StableEmployee]
GO
GRANT EXEC ON dbo.GetAllEmployees TO PUBLIC

/ ****** 개체 : StoredProcedure [dbo]. [GetAllEmployees] 스크립트 날짜 : 2016/01/27/16 16:27:27 ****** /

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[GetAllEmployees]
as
Begin
Select EmployeeId, Name, Gender, City, DepartmentId
From tblEmployee

End

2

모든 사람에게 실행 권한을 부여 할 수 있습니다.

GRANT Execute on [dbo].your_object to [public]

"공개"는 모든 사용자가 속한 기본 데이터베이스 역할입니다.


1

나는 같은 문제에 직면하여 데이터베이스 사용자에게 db_owner 권한도 부여하여 해결했습니다.


11
나는 이것이 좋은 해결책이라고 생각하지 않습니다 ... 웹 응용 프로그램 에이 권한을 부여 할 수 없기 때문에 .. 누가 이것을 투표하는지 몰라
Mina Gabriel

7
이것은 매우 안전하지 않으므로 권장하지 않습니다. 전체 데이터베이스를 완전히 제어 할 수있는 db_owner를 사용하는 대신 적절한 역할을 만들어야합니다.
Yetiish

1

이 사용자를 특정 데이터베이스에 대해 특별하게 만들면 특성의 "사용자 맵핑"에서 db_owner로 설정하지 않을 수 있습니다.


1

보안 권한을 위해 설계된 서버 역할을 수정하는 것이 좋습니다. 사용자에게 sysadmin 서버 역할을 추가하십시오. 더 나은 보안을 위해 사용자 정의 서버 역할이있을 수 있습니다. 그러나이 접근법은 현재 원하는 것을 제공합니다.

  1. 개체 탐색기-> 서버-> 보안-> 로그인
  2. 원하는 사용자를 마우스 오른쪽 버튼으로 클릭하십시오
  3. 왼쪽의 서버 역할로 이동
  4. sysadmin이 확인되어 있는지 확인하십시오
  5. 확인을 누르고 SQL 서버를 다시 시작하십시오.

행운을 빕니다

여기에 이미지 설명을 입력하십시오


1
시스템 관리자는 전체 과잉 (위험)입니다
Trubs

0

다음은 공개되지 않은 한 사용자에게 권한을 부여하는 방법입니다.

직접 쿼리 :

Use MyDatabase Grant execute on [dbo].[My-procedures-name] to [IIS APPPOOL\my-iis-pool] Go

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.