2009-09-24 11 views
45

설정 : SQL Server 2005 & DotNetNuke 05.01.02.개체 'sysobjects', 데이터베이스 'mssqlsystemresource', 스키마 'sys'에 대해 SELECT 권한이 거부되었습니다.

이것은 SQL 스크립트에 "select * from dbo.sysobjects"가있는 DNN 모듈을 설치하려고하는 것으로 시작되었습니다. 내가 DNN 사용자 계정으로 SQL Server Management Studio를 통해 데이터베이스에 로그인

The SELECT permission was denied on the object 'sysobjects', database 'mssqlsystemresource', schema 'sys'.

, 나는 시도하고 sysobjects의보기에서 SELECT를 수행 할 때 저도 같은 오류가 발생합니다 : 즉, 다음과 같은 오류로 실패했습니다.

DNN 사용자 계정에 해당보기에 대한 명시적인 SELECT 권한을 부여하려고했습니다. 보안 -> 사용자 -> DNNUserLogin-> 마우스 오른쪽 단추로 클릭 -> 속성 -> Securables로 이동하여 sys.sysobjects 뷰를 찾으려면이 사용자 계정에 dbo에 대한 명시 적 권한이 있음을 확인하십시오. 그리고 SELECT 확인란이 선택되어 있는지 확인하십시오. 하지만 여전히 그 DNN 사용자 계정으로 sysobjects보기에서 선택을 수행 할 수 없습니다.

내가 뭘 잘못하고 있니? 이 작품을 어떻게 만들 수 있습니까?

답변

84

이것은 사용자에게 거부 권한이있는 경우에도 문제가됩니다. 나는 기본적으로 사용자에게 모든 것을 주었다. 그리고 그것을 부인했다. 그래서 그 권한을 제거하자마자 제대로 작동했습니다.

+11

우리 둘을 만드는 것에 대해 걱정하지 마십시오! 대답을 게시하는 데 건배. – Yos

+1

세 개 만들기;) – jValdron

+1

네 개로 만들어보세요! :) –

4

이 코드를 PUBLIC 역할에 대한 완전한 권한을 제공하는 좋은 서버에서 실행하십시오. 출력을 복사하여 문제가있는 서버에 붙여 넣습니다. 실행. 다시 로그인하십시오. 그것은 우리의 문제를 해결했습니다. 누군가가 공공의 역할에 대한 sys.configurations 에 대한 권한을 취소했을 수도 같은

SELECT SDP.state_desc , 
     SDP.permission_name , 
     SSU.[name] AS "Schema" , 
     SSO.[name] , 
     SSO.[type] 
FROM sys.sysobjects SSO 
     INNER JOIN sys.database_permissions SDP ON SSO.id = SDP.major_id 
     INNER JOIN sys.sysusers SSU ON SSO.uid = SSU.uid 
ORDER BY SSU.[name] , 
     SSO.[name] 
0

는 것 같습니다. 또는이 특정 사용자에게이보기에 대한 액세스를 거부했습니다. 또는 공용 역할이 sys.configurations 테이블에서 제거 된 후 사용자가 생성되었습니다.

공개 사용자 sys.configurationsSELECT 권한을 제공하십시오.

0

잘못되었을 가능성이 너무 많기 때문에 여기 또 다른 가능성이 있습니다. 나는 데이터베이스에서 내 자신의 역할을 설정 한 무언가를 만났다. (예 : "관리자", "관리자", "데이터 엔트리", "고객", 각각 자신의 종류의 제한 사항이 있음) 사용 가능한 유일한 사람은 "관리자"역할 이상이었습니다 그들은 데이터베이스에 사용자를 추가하고 있기 때문에 sysadmin으로 (그리고 그들은 매우 신뢰할 수있었습니다). 또한 추가 된 사용자는 도메인 자격 증명을 사용하는 Windows 도메인 사용자입니다. 데이터베이스에 대한 액세스 권한을 가진 모든 사용자는 도메인에 있어야했지만 도메인의 모든 사용자가 데이터베이스에 액세스 할 수있는 것은 아니 었습니다. 일부 사용자 만 데이터베이스를 변경할 수있었습니다.

어쨌든이 작업 시스템은 갑자기 작동을 멈추고 위와 유사한 오류 메시지가 나타납니다. 내가 그 일을 끝낸 것은 데이터베이스의 "공개"역할에 대한 모든 권한을 거쳐 내가 만든 모든 역할에 권한을 추가하는 것이 었습니다. 나는 당신이 그들을 추가 할 수 없다하더라도 (또는 당신이 그들을 "추가 할 수는 있지만"추가되지는 않을 것입니다) 모든 사람들이 "공개"역할을해야한다는 것을 알고 있습니다.

그래서 "SQL Server Management Studio"에서 응용 프로그램의 데이터베이스에 들어갔습니다. 즉, 현지화 된 이름은 <> 대괄호 안에 숨겨져 있습니다. "(SQL Server - sa)"\ Databases \\ Security \ Roles \ Database Roles \ public "에서"public "을 마우스 오른쪽 버튼으로 클릭하고"Properties "를 선택하고"Database Role Properties - public "대화 상자에서"Securables "페이지를 선택하십시오.목록을 살펴보고 목록의 각 요소에 대해 SQL "Grant"문을 작성하여 해당 권한을 다른 역할에 정확하게 부여하십시오. 예를 들어, "public"역할에 "Execute"권한이있는 스칼라 함수 "[dbo]. [fn_diagramobjects]"가 있습니다. 나는 "보안 개체"목록의 모든 요소에 대해이 작업을 수행 한 후, 나는 내 역할에있는 모든 역할을 선택하는 커서 while 루프에서 그 싸서

EXEC ('GRANT EXECUTE ON [dbo].[fn_diagramobjects] TO [' + @RoleName + '];') 

: 그래서, 나는 다음과 같은 라인을 추가 표. 이것은 명시 적으로 "공용"역할의 모든 권한을 데이터베이스 역할에 부여합니다. 이 시점에서 모든 사용자는 (심지어 "sysadmin"액세스를 제거한 후에도 어떤 일이 일어 났는지 알았을 때 일시적인 조치로 끝냈습니다.)

더 나은 데이터베이스 개체에 대한 일종의 쿼리를 수행하고 공용 역할을 선택하여이 작업을 수행하는 방법이지만 조사 시간이 약 30 시간 정도가 경과 한 후에는이를 파악하지 못했기 때문에 무차별 대입 방식을 사용했습니다. 다른 사람에게 도움이되는 경우 여기에 제 코드가 있습니다.

CREATE PROCEDURE [dbo].[GrantAccess] 
AS 
DECLARE @AppRoleName AS sysname 

DECLARE AppRoleCursor CURSOR LOCAL SCROLL_LOCKS FOR 
    SELECT AppRoleName FROM [dbo].[RoleList]; 

OPEN AppRoleCursor 

FETCH NEXT FROM AppRoleCursor INTO @AppRoleName 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    EXEC ('GRANT EXECUTE ON [dbo].[fn_diagramobjects] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT EXECUTE ON [dbo].[sp_alterdiagram] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT EXECUTE ON [dbo].[sp_creatediagram] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT EXECUTE ON [dbo].[sp_dropdiagram] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT EXECUTE ON [dbo].[sp_helpdiagramdefinition] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT EXECUTE ON [dbo].[sp_helpdiagrams] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT EXECUTE ON [dbo].[sp_renamediagram] TO [' + @AppRoleName + '];') 

    EXEC ('GRANT SELECT ON [sys].[all_columns] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[all_objects] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[all_parameters] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[all_sql_modules] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[all_views] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[allocation_units] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[assemblies] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[assembly_files] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[assembly_modules] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[assembly_references] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[assembly_types] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[asymmetric_keys] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[certificates] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[change_tracking_tables] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[check_constraints] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[column_type_usages] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[column_xml_schema_collection_usages] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[columns] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[computed_columns] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[conversation_endpoints] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[conversation_groups] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[conversation_priorities] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[crypt_properties] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[data_spaces] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[database_audit_specification_details] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[database_audit_specifications] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[database_files] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[database_permissions] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[database_principal_aliases] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[database_principals] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[database_role_members] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[default_constraints] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[destination_data_spaces] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[event_notifications] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[events] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[extended_procedures] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[extended_properties] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[filegroups] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[foreign_key_columns] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[foreign_keys] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[fulltext_catalogs] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[fulltext_index_catalog_usages] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[fulltext_index_columns] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[fulltext_index_fragments] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[fulltext_indexes] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[fulltext_stoplists] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[fulltext_stopwords] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[function_order_columns] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[identity_columns] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[index_columns] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[indexes] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[internal_tables] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[key_constraints] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[key_encryptions] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[message_type_xml_schema_collection_usages] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[module_assembly_usages] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[numbered_procedure_parameters] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[numbered_procedures] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[objects] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[parameter_type_usages] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[parameter_xml_schema_collection_usages] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[parameters] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[partition_functions] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[partition_parameters] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[partition_range_values] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[partition_schemes] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[partitions] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[plan_guides] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[procedures] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[remote_service_bindings] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[routes] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[schemas] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[service_contract_message_usages] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[service_contract_usages] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[service_contracts] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[service_message_types] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[service_queue_usages] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[service_queues] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[services] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[spatial_index_tessellations] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[spatial_indexes] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sql_dependencies] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sql_modules] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[stats] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[stats_columns] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[symmetric_keys] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[synonyms] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[syscolumns] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[syscomments] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysconstraints] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysdepends] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysfilegroups] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysfiles] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysforeignkeys] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysfulltextcatalogs] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysindexes] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysindexkeys] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysmembers] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysobjects] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[syspermissions] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysprotects] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysreferences] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[system_columns] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[system_objects] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[system_parameters] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[system_sql_modules] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[system_views] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[systypes] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[sysusers] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[table_types] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[tables] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[transmission_queue] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[trigger_events] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[triggers] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[type_assembly_usages] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[types] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[views] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_indexes] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_schema_attributes] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_schema_collections] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_schema_component_placements] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_schema_components] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_schema_elements] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_schema_facets] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_schema_model_groups] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_schema_namespaces] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_schema_types] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_schema_wildcard_namespaces] TO [' + @AppRoleName + '];') 
    EXEC ('GRANT SELECT ON [sys].[xml_schema_wildcards] TO [' + @AppRoleName + '];') 

    FETCH NEXT FROM AppRoleCursor INTO @AppRoleName 
END 

CLOSE AppRoleCursor 
RETURN 0 

GO 

시스템에 설치되면 작동시키기 위해 "Exec GrantAccess"가 필요했습니다. (물론 데이터베이스 롤의 이름이 들어있는 "AppRoleName"필드가 포함 된 테이블 [RoleList]이 있습니다.

따라서 미스터리가 남아 있습니다. 왜 모든 사용자가 "공개"역할을 잃었으며 왜 SQL Server 2008 R2 업데이트의 일부였습니까? 각 사용자를 삭제하고 다시 추가하여 도메인과의 연결을 새로 고치는 스크립트가 있었기 때문에 발생 했습니까?

마지막 경고 하나 : 누락되거나 잘못된 것이 없는지 확인하기 위해 시스템을 실행하기 전에 시스템의 "공개"역할을 확인해야합니다. 여기에는 시스템마다 다른 것이있을 수 있습니다 .

다른 사람에게 도움이되기를 바랍니다.

+0

'sys' 스키마 전체에'SELECT'를 부여하지 않은 이유는 무엇입니까? – siride

+1

"지나치게 편집증 적이 지 않은 이유가 무엇입니까?" :-) 사실, 나는 그것을 생각하지 않았다. 나는 그것이 또한 작동 할 것이라고 생각합니다 - 그리고 상향 호환이되는 더 나은 일을 할 수도 있습니다. – Lowell

29

DB 사용자의 DB 역할 db_denydatawriterdb_denydatreader을 제거하여 동일한 오류가 발생하고 해결되었습니다. 이를 위해서는 로그인 >> 속성 >> 사용자 매핑 >> DB에서 적절한 DB 사용자를 선택하고 선택하십시오 >> 위에서 언급 한 Db 사용자 역할의 선택을 취소하십시오. 그게 전부 야 !!

+1

감사합니다 사람은 당신을 저장합니다! –

+0

이것은 제 문제였습니다! 하지만 Toad for SQL Server를 사용합니다. 데니스를 제거하자마자 그것은 효과가있는 것처럼 보였습니다. – dvsoukup

+0

이렇게하려면 다음 명령을 사용하십시오. exec sp_droprolemember 'db_denydatawriter', 'username'및 exec sp_droprolemember 'db_denydatareader', 'username' – kavain