Behandlung von Problemen bei der Sichtbarkeit von Metadaten

Aktualisiert: 14. April 2006

In diesem Thema erhalten Sie Informationen zur Behandlung von Problemen beim Anzeigen von Metadaten.

In SQL Server 2005 kann ein Benutzer nur solche Metadaten sehen, bei denen der Benutzer entweder der Besitzer ist oder für die dem Benutzer eine Berechtigung erteilt wurde. Durch diese Richtlinie wird verhindert, dass Benutzer mit minimalen Berechtigungen Metadaten für alle Objekte in einer Instanz von SQL Server 2005 anzeigen können. Weitere Informationen zur Sichtbarkeit von Metadaten finden Sie unter Konfigurieren der Sichtbarkeit von Metadaten.

So ermöglichen Sie Benutzern die Anzeige von Metadaten

Damit Benutzer mit minimalen Berechtigungen alle Metadaten anzeigen können, führen Sie eine der folgenden Anweisungen aus:

  • GRANT VIEW ANY DEFINITION TO public;
    Mit dieser Anweisung werden Beschränkungen hinsichtlich der Sichtbarkeit von Metadaten auf Instanzebene außer Kraft gesetzt. Alle Metadaten in der Instanz sind für public sichtbar.
  • GRANT VIEW DEFINITION TO public;
    Mit dieser Anweisung werden Beschränkungen hinsichtlich der Sichtbarkeit von Metadaten auf Datenbankebene außer Kraft gesetzt. Alle Metadaten in der Datenbank sind für public sichtbar.
  • GRANT VIEW DEFINITION ON SCHEMA :: <schema_name> TO public;
    Mit dieser Anweisung werden Beschränkungen hinsichtlich der Sichtbarkeit von Metadaten auf Schemaebene außer Kraft gesetzt. Alle Metadaten im Schema sind für public sichtbar.
  • GRANT VIEW DEFINITION ON OBJECT :: <object_name> TO public;
    Mit dieser Anweisung werden Beschränkungen hinsichtlich der Sichtbarkeit von Metadaten auf Objektebene außer Kraft gesetzt. Alle Metadaten für das Objekt sind für public sichtbar. Wenn es sich bei dem Objekt um eine Tabelle handelt, sind alle Spalten, Indizes, Statistiken und Einschränkungen der Tabelle für public sichtbar. Dieses Verhalten wird auch auf GRANT VIEW DEFINITION ON ASSEMBLY und andere ähnliche GRANT-Anweisungen angewendet.

Um einem bestimmten Benutzer mit minimalen Berechtigungen oder einer Rolle die Anzeige aller Metadaten zu ermöglichen, verwenden Sie als Berechtigten anstelle von public einen bestimmten Benutzernamen oder Rollennamen.

So ermöglichen Sie es Benutzern, sich gegenseitig zu sehen

Standardmäßig können sich Benutzer mit minimalen Berechtigungen in den Katalogsichten sys.database_principals und sys.server_principals gegenseitig nicht sehen. Das bedeutet, dass ein Benutzer mit minimalen Berechtigungen, der eine Tabelle besitzt, andere Benutzer nicht sehen kann, denen er möglicherweise Berechtigungen erteilen möchte. Damit Benutzer user_X mit minimalen Berechtigungen einen anderen Benutzer user_Y sehen kann, können Sie die folgende GRANT-Anweisung ausgeben:

  • GRANT VIEW DEFINITION ON USER :: <user_Y> TO <user_X>

Diese Anweisung muss für jeden Benutzer ausgeführt werden. Sie können diesen Prozess automatisieren, indem Sie einen DDL-Trigger ähnlich dem folgenden erstellen:

CREATE TRIGGER grant_view_definition_on_principal ON DATABASE
FOR CREATE_USER, CREATE_ROLE
AS
    DECLARE @event_type sysname, @principal_name sysname, @sql nvarchar(max);
    SELECT @event_type     = eventdata().value('(/EVENT_INSTANCE/EventType) [1]','sysname');
    SELECT @principal_name = eventdata().value('(/EVENT_INSTANCE/ObjectName)[1]','sysname');
    IF (@event_type = 'CREATE_USER')
        SELECT @sql = 'GRANT VIEW DEFINITION ON USER :: ' + @principal_name + ' TO PUBLIC ' ;
    ELSE
        SELECT @sql = 'GRANT VIEW DEFINITION ON ROLE :: ' + @principal_name + ' TO PUBLIC ' ;
    EXEC (@sql) ;
GO

So ermöglichen Sie es Anwendungsrollen, Metadaten auf Serverebene zu sehen

In SQL Server 2005 kann eineAnwendungsrolle nicht auf Metadaten außerhalb der eigenen Datenbank zugreifen, da Anwendungsrollen keinem Prinzipal auf Serverebene zugeordnet werden. Über die folgenden Methoden können Anwendungsrollen Metadaten auf Serverebene anzeigen.

Festlegen eines Ablaufverfolgungsflags

Sie können zulassen, dass Anwendungsrollen auf Metadaten auf Serverebene zugreifen können, indem Sie das globale Flag 4616 festlegen. Weitere Informationen zum Festlegen von Ablaufverfolgungsflags finden Sie unter DBCC TRACEON (Transact-SQL). Weitere Informationen zum Ablaufverfolgungsflag 4616 finden Sie unter Ablaufverfolgungsflags (Transact-SQL).

Verwenden einer zertifikatsignierten gespeicherten Prozedur

Für den Zugriff auf Systemtabellen auf Serverebene wird die Verwendung von zertifikatsignierten Prozeduren empfohlen. Zertifikatsignierte Prozeduren bieten die folgenden Vorteile:

  • Sie müssen kein Ablaufverfolgungsflag verwenden.
  • Es brauchen weniger Informationen auf Serverebene offengelegt zu werden. Rollenbasierte Anwendungen müssen gespeicherte Prozeduren anstelle von allgemeinen Abfragen verwenden. Gespeicherte Prozeduren geben eher nur die von der Anwendung benötigten jeweiligen Daten zurück.
  • Im folgenden Beispiel wird eine zertifikatsignierte gespeicherte Prozedur erstellt und veranschaulicht, wie eine Anwendungsrolle die Prozedur zum Anzeigen von Metadaten auf Serverebene verwenden kann.
USE master;
GO 
CREATE DATABASE approle_db; 
GO 
CREATE LOGIN some_login WITH PASSWORD = 'SomePa$$word!'; 
GO 
USE approle_db; 
GO 
CREATE USER some_user FOR LOGIN some_login; 
GO
EXEC sp_addapprole 'an_approle', 'SomeAppRolePa$$word!'; 
GO
--------------------------------------------------------------------- 
-- This section shows how to use a certificate to authenticate 
-- a signed procedure.
--------------------------------------------------------------------- 
CREATE LOGIN execute_as_login WITH PASSWORD = 'SomePa$$word!'; 
GO 
USE master; 
GO 
GRANT VIEW ANY DEFINITION TO execute_as_login; 
GRANT VIEW SERVER STATE TO execute_as_login; 
GO 
USE approle_db;
GO 
CREATE USER execute_as_user FOR LOGIN execute_as_login; 
GO 
--
-- You must use EXECUTE AS 'authenticator' here because the application role 
-- does not have a server identity. Therefore, the application role cannot use 
-- the certificate permissions on the server. Therefore, you 
-- need a new execution context to which you can grant 
-- the needed VIEW* permissions. 
-- 
CREATE PROC access_server_system_tables 
    WITH EXECUTE AS 'execute_as_user' 
    AS 
    SELECT sid, status, name, dbname, hasaccess, loginname 
        FROM master.dbo.syslogins; 
    SELECT spid, kpid, lastwaittype, waitresource, dbid 
        FROM master.dbo.sysprocesses; 
GO 
GRANT EXECUTE ON access_server_system_tables TO an_approle; 
GO 
CREATE CERTIFICATE signing_cert 
    ENCRYPTION BY PASSWORD = 'SomeCertPa$$word' 
    WITH SUBJECT = 'Signing Cert'; 
GO 
BACKUP CERTIFICATE signing_cert TO FILE = 'signing_cert.cer'; 
GO 
ADD SIGNATURE TO access_server_system_tables
    BY CERTIFICATE signing_cert WITH PASSWORD = 'SomeCertPa$$word';
GO
--------------------------------------------------------------------- 
-- Create a copy of the signing certificate in the target 
-- database. In this case, the target database is the master database. 
-- This copy of the signing certificate vouches for the execution context
-- that enters this database from the signed procedure. 
--------------------------------------------------------------------- 
USE master; 
GO 
CREATE CERTIFICATE signing_cert FROM FILE = 'signing_cert.cer'; 
GO 
--------------------------------------------------------------------- 
-- Because the VIEW permissions in question are server-level permissions,
-- we need to grant AUTHENTICATE SERVER permission on a login-mapped certificate. 
--------------------------------------------------------------------- 

CREATE LOGIN signing_cert_login FROM CERTIFICATE signing_cert; 
GO 
GRANT AUTHENTICATE SERVER TO signing_cert_login 
GO 
--------------------------------------------------------------------- 
-- Now you can open a new connection as "some_login" and 
-- set the application role. Then, call the "access_server_system_tables"
-- procedure, and obtain verification that you can access server-level information 
-- when the application role-based application runs. 
-- For an example, see the Demo usage.sql code below.
--------------------------------------------------------------------- 

--------------------------------------------------------------------- 
-- Clean up. 
-- The following statements remove the objects created above.
--------------------------------------------------------------------- 
USE master 
GO 
DROP DATABASE approle_db; 

DROP LOGIN some_login; 
GO 
DROP LOGIN execute_as_login; 
GO 
DROP LOGIN signing_cert_login; 
GO 
DROP CERTIFICATE signing_cert; 
GO 
-- 
-- Delete the certificate file. 
-- 
EXEC sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
EXEC sp_configure 'xp_cmdshell', 1; 
GO 
RECONFIGURE; 
GO 
EXEC xp_cmdshell 'del "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\signing_cert.cer"'; 
GO 
EXEC sp_configure 'xp_cmdshell', 0; 
GO 
RECONFIGURE; 
GO 

-- ============================================================================
-- - Application role access to server information - Demo usage.sql
--
--  This code is companion code that shows an example of application role access
--  to server information by using a certificate-signed procedure.
--
-- ============================================================================
--  -------------------------------------------------- 
-- Connect as some_login first.
-- ------------------------------------------------ 
USE approle_db;
GO
EXEC sp_setapprole 'an_approle', 'SomeAppRolePa$$word!';
GO
-- Display the server-level information the application role can currently view. 
SELECT sid, status, name, dbname, hasaccess, loginname 
FROM master.dbo.syslogins; 
SELECT spid, kpid, lastwaittype, waitresource, dbid 
FROM master.dbo.sysprocesses; 
GO 
-- Display the server-level information the application role
-- can view by running the certificate-signed stored procedure.
EXEC access_server_system_tables;
GO

Siehe auch

Aufgaben

Problembehandlung bei der Metadatensichtbarkeit von verteilten partitionierten Sichten

Konzepte

Konfigurieren der Sichtbarkeit von Metadaten
Anzeigen von Objektdefinitionen
VIEW DEFINITION-Berechtigung
VIEW ANY DATABASE-Berechtigung

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

14. April 2006

Geänderter Inhalt:
  • Informationen zur Verwendung von zertifikatsignierten gespeicherten Prozeduren wurden im Abschnitt 'So ermöglichen Sie es Anwendungsrollen, Metadaten auf Serverebene zu sehen' hinzugefügt.