Meta veriler görünürlük sorun giderme

Bu konu, meta veriler görüntüleme sorunlarını gidermek için kullanın.

Bir kullanıcı, yalnızca ya da kullanıcının sahip olduğu veya kullanıcı bazı izninin verilmiş meta veriler görebilirsiniz.Bu ilke, en az ayrıcalıklara sahip kullanıcılar örneğini tüm nesneler için meta veriler görüntülemesini engeller SQL Server. meta veriler görünürlüğü hakkında daha fazla bilgi için bkz: Meta veriler görünürlük yapılandırma.

Kullanıcıları Görüntüle meta veriler uygulansın için

En az olan kullanıcılar için tüm meta veriler, aþaðýdaki birini çalıştırmayı ayrıcalığına bakın:

  • GRANT VIEW ANY DEFINITION TO public;

    Bu deyim örneği en meta veriler görünürlük sınırlamaları kılar düzey.Tüm meta veriler örnek görülebilir Ortak.

  • GRANT VIEW DEFINITION TO public;

    Bu deyim, meta veriler görünürlük sınırlamaları veritabanı en kılar düzey.Veritabanındaki tüm meta veriler görülebilir Ortak.

  • GRANT VIEW DEFINITION ON SCHEMA :: <schema_name> TO public;

    Bu deyim adresindeki şema meta veriler görünürlük sınırlamaları kılar düzey.Şemadaki tüm meta veriler görülebilir Ortak.

  • GRANT VIEW DEFINITION ON OBJECT :: <object_name> TO public;

    Bu deyim nesne düzeyinde meta veriler görünürlük sınırlamaları geçersiz kılar.Tüm meta veriler nesnesi görülebilir Ortak.Nesne bir tablo, tüm sütunları, dizinleri, istatistikler ve tablo kısıtlamaları görülebilir Ortak.Bu davranış, GRANT VIEW TANıM ON derleme ve diğer benzer GRANT deyimi için de geçerlidir.

Tüm meta veriler görmek belirli bir kullanıcının en az ayrıcalıklara veya rol ile etkinleştirmek için , yerine grantee olarak belirli bir kullanıcı veya rolün adını kullanın... Ortak.

Let için her diğer kullanıcılar Bkz:

Varsayılan olarak, en az ayrıcalıklara sahip olan kullanıcılar, diğer kullanıcılar göremez sys.database_principals and sys.server_principals katalog görünümleri.Sahibi olan kullanıcının en az ayrıcalıklara sahip yani bir tablo kullanıcı için izinler vermek isteyebileceğiniz başka kullanıcılar göremez.Kullanıcı izin vermek için user_X en az ayrıcalıklara sahip başka bir kullanıcı için bkz: user_Y, aşağıdakileri verebilir GRANT Deyim:

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

Bu çalıştırmak zorunda deyim her kullanıcı için.Işlem, aşağıdakine benzer bir DDL tetikleyicisi oluşturarak otomatikleştirebilirsiniz:

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

Uygulama rolleri Bkz: Server-CVE-2006-düzey meta uygulansın için

Bir uygulama rolü , uygulama rolleri bir sunucu-ile ilişkili olduğu için meta veriler, kendi veritabanı dışında erişemiyor düzey asıl.Uygulama rolleri Bkz: sunucu-CVE-2006-izin vermek için aşağıdaki yöntemleri kullanılabilir düzey meta veriler.

küme bir izleme bayrağı

Uygulama rolleri, sunucu-CVE-2006-erişmeye izin vermek için düzey meta verileri, küme genel bayrağını 4616.Izleme bayrağı'nı ayarlama hakkında daha fazla bilgi için bkz: DBCC TRACEON (Transact-SQL). Izleme bayrağı 4616 hakkında daha fazla bilgi için bkz: İzleme Bayrakları (Transact-SQL).

Sertifika imzalı bir saklı yordamı kullanın.

Sertifika imzalı yordamlar sunucu-CVE-2006-erişmek için kullanacağınız öneririz düzey sistem tabloları.Sertifika imzalı yordamlar aşağıdaki yararları sağlar:

  • Bir izleme bayrağı'nı kullanmanız gerekmez.

  • Daha az sunucu-düzey bilgi açılmıştır.Uygulama rol tabanlı uygulamalar, saklı yordamlar yerine Genel sorguların kullanmanız gerekir.Saklı yordamlar uygulama tarafından gerekli olan yalnızca belirli verileri daha olasıdır.

  • Aşağıdaki örnek, bir sertifika imzalı bir saklı yordam oluşturur ve uygulama rolü sunucu düzeyinde meta veriler görüntülemek için yordamı nasıl kullanabileceğinizi gösterir.

USE master;
GO 
CREATE DATABASE approle_db; 
GO 
CREATE LOGIN some_login WITH PASSWORD = '<enterStrongPasswordHere>'; 
GO 
USE approle_db; 
GO 
CREATE USER some_user FOR LOGIN some_login; 
GO
EXEC sp_addapprole 'an_approle', '<enterStrongPasswordHere>'; 
GO
--------------------------------------------------------------------- 
-- This section shows how to use a certificate to authenticate 
-- a signed procedure.
--------------------------------------------------------------------- 
CREATE LOGIN execute_as_login WITH PASSWORD = '<enterStrongPasswordHere>'; 
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 = '<enterStrongPasswordHere>' 
    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 = '<enterStrongPasswordHere>';
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\MSSQL10.MSSQLSERVER\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', '<enterStrongPasswordHere>';
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