2009-07-16 11 views
31

데이터베이스가 있고 데이터베이스의 "제품"이라는 테이블에 일부 필드를 추가하는 sql 스크립트가 있습니다. 이 에러가 발생한 것 왜개체가 없거나 사용 권한이 없기 때문에 개체를 찾을 수 없습니다. SQL Server에 오류가 있습니다.

Cannot find the object "Products" because it does not exist or you do not have permissions 

나는 그것을 해결하기 위해 어떻게해야 :이 스크립트를 실행하고 때

, 나는 다음과 같은 오류는 무엇입니까?

+0

이것은 *** sql 스크립트 ***입니까? – Kiquenet

+0

권한과 관련된 것일 수 있습니다. 사용자가 db_owner 역할의 구성원입니까? – Tarzan

답변

54

올바른 데이터베이스에 대해 스크립트를 실행 하시겠습니까? SQL 서버 관리 스튜디오에서 당신은 당신이 도구 모음 중 하나에 드롭 다운 상자에 대해 쿼리를 실행하는 데이터베이스를 변경하거나이 당신의 쿼리를 시작할 수 있습니다

USE SomeDatabase 
5

당신이있어 사용자를합니까 이 스크립트를 실행해도 테이블을 볼 수 있습니까?

select top 1 * from products 

출력이 있나요?

예인 경우 :이 사용자는 테이블을 수정할 수있는 권한이 있습니까? 예 : ALTER TABLE 등의 DDL 스크립트를 실행합니까? 일반적으로 일반 사용자에게는 이러한 승격 된 사용 권한이 없습니다.

1

프로 시저를 마우스 오른쪽 단추로 클릭하고 속성을 선택하여 로그인 ID에 부여 된 사용 권한을 확인할 수 있습니다. 그런 다음 수동으로 "실행"을 선택하고 해당 프로 시저에 대한 권한을 변경할 수 있습니다.

또는 스크립트

이는 다음과 같습니다

GRANT EXECUTE ON OBJECT::dbo.[PROCNAME] 
    TO [ServerInstance\user]; 

GRANT ALTER ON OBJECT::dbo.[PROCNAME] 
    TO [ServerInstance\user]; 
+0

프로 시저가 실행되고 있습니다 ... 문제는 프로 시저가 아니라 테이블에 대한 액세스입니다. –

46

나는 이런 일이 왜 이유를 발견했다. 사용자가 적절한 권한을 가지고 있지만, 저장 프로 시저가 TRUNCATE 문을 포함 : TRUNCATE가 로그인하지 않고 항목을 삭제하기 때문에, 당신이 (분명히)를 포함하는 저장 프로 시저를 실행하려면 관리자 권한이 필요

TRUNCATE의 TABLENAME을. TABLENAME

에서 삭제

... 그리고 오류가 도망 갔어요 : 우리에 문을 변경!

+1

truncate 문이 나에게도 문제가되었습니다. truncate에 대한 적절한 사용 권한을 추가하여이를 수정했습니다. – Andrew

+2

이것은 SQL 서버 버그로 기록되어야합니다. 오류 메시지는 "개체 x을 찾을 수 없습니다 ..."이지만 문제는 x와 다른 개체의 사용 권한과 관련이 있습니다. 아니요, 오류 메시지는 "존재하지 않기 때문에 개체 x를 찾을 수 없거나 사용 권한이 없습니다"라는 오류 메시지가 아닙니다. 존재하지 않는 오류 메시지가 약간의 단서를 제공 할 수 있지만 권한 문제가있는 올바른 개체를 나타내는 오류 메시지만큼 유용하지는 않습니다. – Sam

+0

그건 내 문제 였어. 내 로컬 사용자는 완벽하게 작동했지만 프로덕션 환경에서는 서비스 계정을 사용하지 않았다. – Harpunius

2

또한 당신이 로그인 스키마에서 "제품"을 만들었으며이 단계는이 문제

를 해결하기 위해 다른 스키마 (아마도으로 dbo)

에서 동일한을 실행하려고했던 것을 할 수 있었다 1) 관리 스튜디오를 엽니 다 2) 탐색기에서 개체를 찾고 개체가있는 스키마를 확인합니다. (그것은 당신의 객체 이름 앞에 텍스트입니다). 그것 "DBO"내 개체 이름 아래 그림에서 당신은 다음 당신이 특정 스키마에 대한 권한을 수정할 수 없습니다해야한다 "yourcompanydoamin \ yourloginid"처럼 보는 경우에 동작 상태

highlighted part is schema name

입니다 다른 스키마.

당신은 [dbo.Product] 대신 [dbo].[Product]로 테이블을 참조 인해 오타에 "Ownership and User-Schema Separation in SQL Server"

2

또한 발생할 수 있습니다 참조 할 수 있습니다.

0

내 경우에는 내가 기대했던 것과 다른 사용자로 실행되었습니다.

은 내가 pypyodbc.connect()에 전달 된 연결 문자열로 'DRIVER={SQL Server};SERVER=...;DATABASE=...;Trusted_Connection=false;User Id=XXX;Password=YYY'했지만, 연결이 여전히 스크립트를 실행 Windows 사용자의 자격 증명을 사용했다 (나는 이것이 SQL Server 프로파일 러를 사용하여 잘못된 UID/암호 조합을 시도하여 확인 - 예상되는 오류가 발생하지 않음). 내가 DEV하지만 오류가 발생하는 PROD에서 테이블을 복사하기 위해 노력했습니다

conn = pypyodbc.connect(driver='{SQL Server}', server='servername', database='dbname', uid='userName', pwd='Password') 
0

:

내가이 문제를 해결 연결이 더 좋은 방법으로 전환하기 때문에, 더이 파고하지 않기로 결정 : "개체 X가 없거나 사용 권한이 없기 때문에 개체 X를 찾을 수 없습니다."

그러나 테이블이 존재했기 때문에 sa 권한으로 실행했습니다.

문제는 실제로 계약서에있었습니다. DEV에있는 테이블의 이름을 old_XXX 개월 전으로 변경했습니다. 그러나 PROD에서 원본을 복사하려고 할 때 Defaut Constraint 이름이 충돌했습니다.

오류 메시지가 잘못된 것입니다

+1

답을 쉽게 이해할 수 있도록 재현 가능한 코드를 추가해야합니다. –

+0

죄송합니다. SSIS GUI 만 사용합니다. 스크린 샷이 없어도이를 전달할 수있는 방법이 있습니까? –

관련 문제