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

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

Bir kullanıcı yalnızca ya da sahibi olan kullanıcı veya kullanıcı bazı izni verilmiş meta veriler görebilirsiniz.Bu ilke kullanıcıların en az ayrıcalıklara sahip tüm nesneler için meta veriler görmelerini engeller bir örnek , SQL Server.meta veriler görünürlük hakkında daha fazla bilgi için bkz: Meta veri görünürlük yapılandırma.

Kullanıcıların görünümü meta verileri için

En az olan kullanıcılara izin vermek için aşağıdaki ifadelerden birini çalıştırmayı tüm meta veriler ayrıcalıkları bakın:

  • GRANT VIEW ANY DEFINITION TO public;

    Bu deyim örneği konumundaki meta veriler görünürlük sınırlamaları geçersiz kılar düzey.Tüm meta veriler örnek görülebilir ortak.

  • GRANT VIEW DEFINITION TO public;

    Bu deyim sırasında veritabanı meta veriler görünürlük kısıtlamaları geçersiz kılar düzey.Veritabanındaki tüm meta veriler görünür ortak.

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

    Bu deyim adresindeki şema meta veriler görünürlük kısıtlamaları geçersiz kılar düzey.Şemadaki tüm meta veriler görünür ortak.

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

    Bu deyim meta veriler görünürlük sınırlamaları nesnede geçersiz kılar düzey.Nesne için tüm meta veriler görünür ortak.Nesne bir tablo, tüm sütunları, dizinleri, istatistikleri Tablo kısıtlamaları için görünür olacaktır ise ortak.Bu davranış, grant görünüm TANIMI üzerinde 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ı kullanmak ortak.

Let için bkz: kullanıcıları birbirine

Varsayılan olarak, diğer kullanıcıların en az ayrıcalıklara sahip kullanıcılar göremezler sys.database_principals ve sys.server_principals katalog görünümleri.Tablo sahibi en az ayrıcalıkları olan bir kullanıcı, diğer kullanıcılar için kullanıcı izinleri vermek isteyebilirsiniz göremiyor bu anlamına gelir.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ğıdaki sorun GRANT deyim:

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

Bu çalıştırmak zorunda deyim her kullanıcı için.Aşağıdakine benzer DDL tetikleyicisi oluşturma işlemi otomatik hale getirebilirsiniz:

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: sunucu düzeyinde meta verileri sağlamak için

Bir uygulama rolü dışında kendi veritabanı meta veriler uygulama rolleri bir sunucu - ile ilişkili olduğu için erişemiyordüzey asıl.Uygulama rolleri Bkz: server - bildirmek için aşağıdaki yöntemleri kullanılabilirdüzey meta veriler.

İzleme bayrağı ayarlanmış

Uygulama rolleri sunucu - erişmek izin vermek içindüzey meta veriler, küme global bayrağı 4616.Ayar izleme bayraklar hakkında daha fazla bilgi için bkz: dbcc traceon (Transact-sql).İzleme bayrağı 4616 hakkında daha fazla bilgi için bkz: İzleme Bayrakları (Transact-SQL).

Sertifika imzalı bir saklı yordam kullanın

Server - erişmek için Sertifika imzalı yordamları kullanmanızı öneririzdüzey sistem tabloları.Sertifika imzalı yordamlar aşağıdaki yararları sağlar:

  • İzleme bayrağı kullanmak zorunda değil.

  • Daha az sunucu -düzey bilgi açılmıştır.Uygulama rol tabanlı uygulamalar yerine genel sorgular saklı yordamları kullanmanız gerekir.Saklı yordamları uygulama için gereken belirli verilere dönmesi olasılığı daha fazladır.

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

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_50.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