Freigeben über


Erteilen von Berechtigungen für eine XML-Schemaauflistung

Sie können Berechtigungen zum Erstellen einer XML-Schemaauflistung erteilen und auch Berechtigungen für ein XML-Schemasammlungsobjekt erteilen.

Erteilen der Berechtigung zum Erstellen einer XML-Schemaauflistung

Zum Erstellen einer XML-Schemaauflistung sind die folgenden Berechtigungen erforderlich:

  • Der Principal benötigt die BERECHTIGUNG CREATE XML SCHEMA COLLECTION auf Datenbankebene.

  • Da die XML-Schemasammlungen in Beziehungsschema-Bereich definiert sind, muss der Prinzipal auch über die ALTER-Berechtigung für das relationale Schema verfügen.

Die folgenden Berechtigungen erlauben es einem Hauptbenutzer, eine XML-Schemasammlung in einem relationalen Schema innerhalb einer Datenbank auf einem Server zu erstellen.

  • CONTROL-Berechtigung auf dem Server

  • Berechtigung zum Ändern beliebiger Datenbanken auf dem Server

  • ALTER-Berechtigung für die Datenbank

  • Steuerungsberechtigung in der Datenbank

  • ALTER ANY SCHEMA-Berechtigung und CREATE XML SCHEMA COLLECTION-Berechtigung in der Datenbank

  • ALTER- oder CONTROL-Berechtigung für das relationale Schema und Berechtigung zum Erstellen einer XML-Schema-Sammlung in der Datenbank

Diese letzte Methode von Berechtigungen wird im folgenden Beispiel verwendet.

Der Besitzer des relationalen Schemas wird der Besitzer der XML-Schemaauflistung, die in diesem Schema erstellt wurde. Dieser Besitzer hat dann die vollständige Kontrolle über die XML-Schemaauflistung. Daher kann dieser Besitzer die XML-Schemaauflistung ändern, eine XML-Spalte eingeben oder die XML-Schemaauflistung ablegen.

Erteilen von Berechtigungen für ein XML-Schemaauflistungsobjekt

Die folgenden Berechtigungen sind für die XML-Schemaauflistung zulässig:

  • Die ALTER-Berechtigung ist erforderlich, wenn Der Inhalt einer vorhandenen XML-Schemaauflistung mithilfe der ALTER XML SCHEMA COLLECTION-Anweisung geändert wird.

  • Mit der CTRL-Berechtigung kann ein Benutzer einen beliebigen Vorgang in der XML-Schemaauflistung ausführen.

  • Die Berechtigung zum Übernehmen von Besitzrechten ist erforderlich, um die Besitzrechte der XML-Schema-Sammlung von einer Instanz auf eine andere zu übertragen.

  • Die REFERENCES-Berechtigung autorisiert den Prinzipal, die XML-Schemaauflistung zu verwenden, um xml zu typisieren oder Typspalten in Tabellen, Ansichten und Parametern einzuschränken. Die REFERENCES-Berechtigung ist auch erforderlich, wenn eine XML-Schemaauflistung auf eine andere verweist.

  • Die VIEW DEFINITION-Berechtigung ermöglicht es dem Prinzipal, den Inhalt einer XML-Schemaauflistung entweder über XML_SCHEMA_NAMESPACE oder über die Katalogansichten abzufragen, vorausgesetzt, dieser Prinzipal verfügt auch über eine der Berechtigungen ALTER, REFERENCES oder CONTROL für die Auflistung.

  • Die EXECUTE-Berechtigung ist erforderlich, um vom Prinzipal eingefügte oder aktualisierte Werte anhand der XML-Schemaauflistung zu überprüfen, die die xml Typspalten, Variablen und Parameter eingibt oder einschränkt. Sie benötigen diese Berechtigung auch, wenn Sie den in diesen Spalten und Variablen gespeicherten XML-Code abfragen.

Beispiele

Die Szenarien in den folgenden Beispielen veranschaulichen, wie XML-Schemaberechtigungen funktionieren. Jedes Beispiel erstellt die erforderliche Testdatenbank, relationale Schemas und Anmeldungen. Diese Anmeldungen erhalten die erforderlichen Berechtigungen für die XML-Schemasammlung. In jedem Beispiel wird am Ende die erforderliche Bereinigung durchgeführt.

Ein. Erteilen von Berechtigungen zum Erstellen einer XML-Schemasammlung

Das folgende Beispiel zeigt, wie Sie Berechtigungen erteilen, damit ein Prinzipal eine XML-Schemaauflistung erstellen kann. Im Beispiel wird eine Beispieldatenbank und ein Testbenutzer erstellt. TestLogin1 TestLogin1 erhält dann die Berechtigung ALTER für das relationale Schema und CREATE XML SCHEMA COLLECTION für die Datenbank. Mit diesen Berechtigungen gelingt es TestLogin1, eine XML-Beispielschemaauflistung zu erstellen.

SETUSER  
GO  
USE master  
GO  
CREATE LOGIN TestLogin1 WITH password='SQLSvrPwd1'  
GO  
CREATE DATABASE SampleDBForSchemaPermissions  
GO  
USE SampleDBForSchemaPermissions  
GO  
CREATE USER TestLogin1  
GO  
-- User must have ALTER permission on the relational schema in the database.  
GRANT ALTER ON SCHEMA::dbo TO TestLogin1  
GO  
-- User also must have permission to create XML schema collections in the database.  
GRANT CREATE XML SCHEMA COLLECTION   
TO TestLogin1  
GO  
-- Execute CREATE XML SCHEMA COLLECTION.  
SETUSER 'TestLogin1'  
GO  
CREATE XML SCHEMA COLLECTION myTestSchemaCollection AS '<?xml version="1.0" encoding="UTF-8" ?>  
<xsd:schema targetNamespace="http://schemas.adventure-works.com/Additional/ContactInfo"   
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
elementFormDefault="qualified">  
<xsd:element name="AdditionalContactInfo" >  
  <xsd:complexType mixed="true" >  
    <xsd:sequence>  
      <xsd:any processContents="strict"    
               namespace="http://schemas.adventure-works.com/Contact/Record   
                          http://schemas.adventure-works.com/AdditionalContactTypes"  
               minOccurs="0" maxOccurs="unbounded" />  
    </xsd:sequence>  
  </xsd:complexType>  
</xsd:element>  
<xsd:element name="root" type="xsd:byte"/>  
</xsd:schema>'  
GO  
-- Final cleanup  
SETUSER  
GO  
USE master  
GO  
DROP DATABASE SampleDBForSchemaPermissions  
GO  
DROP LOGIN TestLogin1  
GO  

B. Erteilen von Berechtigungen für die Verwendung einer vorhandenen XML-Schemaauflistung

Das folgende Beispiel zeigt das Berechtigungsmodell für die XML-Schemaauflistung weiter. Das Beispiel zeigt, wie unterschiedliche Berechtigungen zum Erstellen und Verwenden der XML-Schemaauflistung erforderlich sind.

Im Beispiel wird eine Testdatenbank und eine Anmeldung erstellt. TestLogin1 TestLogin1 erstellt eine XML-Schemaauflistung in der Datenbank. Die Anmeldung erstellt dann eine Tabelle und verwendet die XML-Schemaauflistung, um eine typierte XML-Spalte zu erstellen. Der Benutzer fügt dann Daten ein und fragt sie ab. Alle diese Schritte erfordern die erforderlichen Schemaberechtigungen, wie im Code gezeigt.

SETUSER  
GO  
USE master  
GO  
CREATE LOGIN TestLogin1 WITH password='SQLSvrPwd1'  
GO  
CREATE DATABASE SampleDBForSchemaPermissions  
GO  
USE SampleDBForSchemaPermissions  
GO  
CREATE USER TestLogin1  
GO  
-- Grant permission to the user.  
SETUSER  
GO  
-- User must have ALTER permission on the relational schema in the database.  
GRANT ALTER ON SCHEMA::dbo TO TestLogin1  
GO  
-- User also must have permission to create XML schema collections in the database.  
GRANT CREATE XML SCHEMA COLLECTION   
TO TestLogin1  
GO  
-- Now user can execute the previous CREATE XML SCHEMA COLLECTION statement.  
SETUSER 'TestLogin1'  
GO  
CREATE XML SCHEMA COLLECTION myTestSchemaCollection AS '<?xml version="1.0" encoding="UTF-8" ?>  
<xsd:schema targetNamespace="http://schemas.adventure-works.com/Additional/ContactInfo"   
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
elementFormDefault="qualified">  
  
<xsd:element name="AdditionalContactInfo" >  
  <xsd:complexType mixed="true" >  
    <xsd:sequence>  
      <xsd:any processContents="strict"    
               namespace="http://schemas.adventure-works.com/Contact/Record   
                          http://schemas.adventure-works.com/AdditionalContactTypes"  
               minOccurs="0" maxOccurs="unbounded" />  
    </xsd:sequence>  
  </xsd:complexType>  
</xsd:element>  
<xsd:element name="telephone" type="xsd:string" />  
</xsd:schema>'  
GO  
  
-- Create a table by using the collection to type an XML column.   
--TestLogin1 must have permission to create a table.  
SETUSER  
GO  
GRANT CREATE TABLE TO TestLogin1  
GO  
-- The user also must have REFERENCES permission to use the XML schema collection  
-- to create a typed XML column (REFERENCES permission on schema   
-- collection is not needed).  
GRANT REFERENCES ON XML SCHEMA COLLECTION::myTestSchemaCollection   
TO TestLogin1  
GO  
-- Now user can create a table and use the XML schema collection to create   
-- a typed XML column.  
SETUSER 'TestLogin1'  
GO  
CREATE TABLE MyTestTable (xmlCol xml (dbo.myTestSchemaCollection))  
GO  
-- To insert data in the table, the user needs EXECUTE permission on the XML schema collection.  
-- GRANT EXECUTE permission to TestLogin2 on the xml schema collection.  
SETUSER  
GO  
GRANT EXECUTE ON XML SCHEMA COLLECTION::myTestSchemaCollection   
TO TestLogin1  
GO  
-- TestLogin1 does not own the dbo schema. This user must have INSERT permission.  
GRANT INSERT TO TestLogin1  
GO  
-- Now the user can insert data into the table.  
SETUSER 'TestLogin1'  
GO  
INSERT INTO MyTestTable VALUES('  
<telephone xmlns="http://schemas.adventure-works.com/Additional/ContactInfo">111-1111</telephone>  
')  
GO  
-- To query the table, TestLogin1 must have permissions: SELECT on the table and EXECUTE on the XML schema collection.  
SETUSER  
GO  
GRANT SELECT TO TestLogin1  
GO  
-- TestLogin1 already has EXECUTE permission on the schema (granted before inserting a record in the table).  
SELECT xmlCol.query('declare default element namespace "http://schemas.adventure-works.com/Additional/ContactInfo" /telephone[1]')  
FROM MyTestTable  
GO  
-- To show that the user must have EXECUTE permission to query, revoke the  
-- previously granted permission and return the query.  
SETUSER  
GO  
REVOKE EXECUTE ON XML SCHEMA COLLECTION::myTestSchemaCollection to TestLogin1  
Go  
-- Now TestLogin1 cannot execute the query.  
SETUSER 'TestLogin1'  
GO  
SELECT xmlCol.query('declare default element namespace "http://schemas.adventure-works.com/Additional/ContactInfo" /telephone[1]')  
FROM MyTestTable  
GO  
-- Final cleanup   
SETUSER  
GO  
USE master  
GO  
DROP DATABASE SampleDBForSchemaPermissions  
GO  
DROP LOGIN TestLogin1  
GO  

C. Gewähren von ALTER-Berechtigungen für eine XML-Schemaauflistung

Ein Benutzer muss über DIE BERECHTIGUNG ALTER verfügen, um eine vorhandene XML-Schemaauflistung in der Datenbank zu ändern. Das folgende Beispiel zeigt, wie Sie die Berechtigung ALTER erteilen.

SETUSER  
GO  
USE master  
GO  
CREATE LOGIN TestLogin1 WITH password='SQLSvrPwd1'  
GO  
CREATE DATABASE SampleDBForSchemaPermissions  
GO  
USE SampleDBForSchemaPermissions  
GO  
CREATE USER TestLogin1  
GO  
-- Grant permission to the user.  
SETUSER  
GO  
-- User must have ALTER permission on the relational schema in the database.  
GRANT ALTER ON SCHEMA::dbo TO TestLogin1  
GO  
-- User also must have permission to create XML schema collections in the database.  
GRANT CREATE XML SCHEMA COLLECTION   
TO TestLogin1  
GO  
-- Now user can execute the previous CREATE XML SCHEMA COLLECTION statement.  
SETUSER 'TestLogin1'  
GO  
CREATE XML SCHEMA COLLECTION myTestSchemaCollection AS '<?xml version="1.0" encoding="UTF-8" ?>  
<xsd:schema targetNamespace="http://schemas.adventure-works.com/Additional/ContactInfo"   
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
elementFormDefault="qualified">  
  
<xsd:element name="AdditionalContactInfo" >  
  <xsd:complexType mixed="true" >  
    <xsd:sequence>  
      <xsd:any processContents="strict"    
               namespace="http://schemas.adventure-works.com/Contact/Record   
                          http://schemas.adventure-works.com/AdditionalContactTypes"  
               minOccurs="0" maxOccurs="unbounded" />  
    </xsd:sequence>  
  </xsd:complexType>  
</xsd:element>  
<xsd:element name="telephone" type="xsd:string" />  
</xsd:schema>'  
GO  
-- Grant ALTER permission to TestLogin1.  
setuser  
GO  
GRANT ALTER ON XML SCHEMA COLLECTION::myTestSchemaCollection TO TestLogin1  
GO  
-- TestLogin1 should be able to add components to the collection.  
SETUSER 'TestLogin1'  
GO  
ALTER XML SCHEMA COLLECTION myTestSchemaCollection ADD '  
<xsd:schema targetNamespace="http://schemas.adventure-works.com/Additional/ContactInfo"   
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
            xmlns="http://schemas.adventure-works.com/Additional/ContactInfo"   
elementFormDefault="qualified">  
 <xsd:element name="pager" type="xsd:string"/>  
</xsd:schema>  
'  
Go  
-- Final cleanup   
SETUSER  
GO  
USE master  
GO  
DROP DATABASE SampleDBForSchemaPermissions  
GO  
DROP LOGIN TestLogin1  
GO  

D. Erteilen der Berechtigung "Take Ownership" für eine XML-Schemasammlung

Das folgende Beispiel zeigt, wie sie den Besitz des XML-Schemas von einem Benutzer in einen anderen übertragen. Damit das Beispiel interessanter wird, funktionieren die Benutzer in diesem Beispiel in verschiedenen relationalen Standardschemas.

In diesem Beispiel werden folgende Schritte ausgeführt:

  • Erstellt eine Datenbank mit zwei relationalen Schemas dbo und myOtherDBSchema).

  • Erstellt zwei Benutzer TestLogin1 und TestLogin2. TestLogin2 wird zum Besitzer des myOtherDBSchema relationalen Schemas.

  • TestLogin1 erstellt eine XML-Schemaauflistung im dbo relationalen Schema.

  • TestLogin1 erteilt dann TAKE OWNERSHIP die Berechtigung für die XML-Schemaauflistung für TestLogin2.

  • TestLogin2 wird der Besitzer der XML-Schemaauflistung in myOtherDBSchema, ohne das relationale Schema der XML-Schemaauflistung zu ändern.

CREATE LOGIN TestLogin1 with password='SQLSvrPwd1'  
GO  
CREATE LOGIN TestLogin2 with password='SQLSvrPwd2'  
GO  
CREATE DATABASE SampleDBForSchemaPermissions  
GO  
USE SampleDBForSchemaPermissions  
GO  
-- Create another relational schema in the database.  
CREATE SCHEMA myOtherDBSchema  
GO  
-- Create users in the database. Note TestLogin2's default schema is  
-- myOtherDBSchema.  
CREATE USER TestLogin1  
GO  
CREATE USER TestLogin2 WITH DEFAULT_SCHEMA=myOtherDBSchema  
GO  
-- TestLogin2 will own myOtherDBSchema relational schema.  
ALTER AUTHORIZATION ON SCHEMA::myOtherDBSchema TO TestLogin2  
GO  
  
-- For TestLogin1 to create XML schema collection, the following  
-- permission is required.  
GRANT CREATE XML SCHEMA COLLECTION   
TO TestLogin1  
GO  
GRANT ALTER ON SCHEMA::dbo TO TestLogin1  
GO  
-- Now TestLogin1 can create an XML schema collection.  
setuser 'TestLogin1'  
GO  
CREATE XML SCHEMA COLLECTION myTestSchemaCollection AS '<?xml version="1.0" encoding="UTF-8" ?>  
<xsd:schema targetNamespace="http://schemas.adventure-works.com/Additional/ContactInfo"   
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
elementFormDefault="qualified">  
  
<xsd:element name="AdditionalContactInfo" >  
 <xsd:complexType mixed="true" >  
    <xsd:sequence>  
      <xsd:any processContents="strict"   
               namespace="http://schemas.adventure-works.com/Contact/Record   
                          http://schemas.adventure-works.com/AdditionalContactTypes"  
               minOccurs="0" maxOccurs="unbounded" />  
    </xsd:sequence>  
 </xsd:complexType>  
</xsd:element>  
<xsd:element name="telephone" type="xsd:string" />  
</xsd:schema>'  
GO  
  
-- Grant TAKE OWNERSHIP to TestLogin2.  
SETUSER  
GO  
GRANT TAKE OWNERSHIP ON XML SCHEMA COLLECTION::dbo.myTestSchemaCollection   
TO TestLogin2  
GO  
-- Verify the owner. Note the UserName and Principal_id is null.   
SELECT user_name(sys.xml_schema_collections.principal_id) as UserName,   
       sys.schemas.name as RelSchemaName,*   
FROM   sys.xml_schema_collections   
      JOIN sys.schemas   
      ON sys.schemas.schema_id=sys.xml_schema_collections.schema_id  
GO  
-- TestLogin2 can take ownership now.  
setuser 'TestLogin2'  
GO  
ALTER AUTHORIZATION ON XML SCHEMA COLLECTION::dbo.myTestSchemaCollection   
TO TestLogin2  
GO  
-- Note that although TestLogin2 is the owner,the XML schema collection   
-- is still in dbo.  
SELECT user_name(sys.xml_schema_collections.principal_id) as UserName,   
      sys.schemas.name as RelSchemaName,*   
FROM sys.xml_schema_collections JOIN sys.schemas   
     ON sys.schemas.schema_id=sys.xml_schema_collections.schema_id  
GO  
  
-- TestLogin2 moves the collection from dbo to myOtherDBSchema relational schema.  
-- TestLogin2 already has all necessary permissions.  
-- 1) TestLogin2 owns the destination relational schema so he can alter it.  
-- 2) TestLogin2 owns the XML schema collection (therefore, has CONTROL permission).  
ALTER SCHEMA myOtherDBSchema  
TRANSFER XML SCHEMA COLLECTION::dbo.myTestSchemaCollection  
GO  
  
SELECT user_name(sys.xml_schema_collections.principal_id) as UserName,   
       sys.schemas.name as RelSchemaName,*   
FROM   sys.xml_schema_collections JOIN sys.schemas   
       ON sys.schemas.schema_id=sys.xml_schema_collections.schema_id  
GO  
-- Final cleanup   
SETUSER  
GO  
USE master  
GO  
DROP DATABASE SampleDBForSchemaPermissions  
GO  
DROP LOGIN TestLogin1  
DROP LOGIN TestLogin2  
go   

E. Gewähren der VIEW DEFINITION-Berechtigung für eine XML-Schemaauflistung

Im folgenden Beispiel wird gezeigt, wie Sie VIEW DEFINITION-Berechtigungen für eine XML-Schemaauflistung erteilen.

SETUSER  
GO  
USE master  
GO  
IF EXISTS( SELECT * FROM sysdatabases WHERE name='permissionsDB' )  
   DROP DATABASE permissionsDB  
GO  
IF EXISTS( SELECT * FROM sys.sql_logins WHERE name='schemaUser' )  
   DROP LOGIN schemaUser  
GO  
CREATE DATABASE permissionsDB  
GO  
CREATE LOGIN schemaUser WITH PASSWORD='Pass#123',DEFAULT_DATABASE=permissionsDB  
GO  
GRANT CONNECT SQL TO schemaUser  
GO  
USE permissionsDB  
GO  
CREATE USER schemaUser WITH DEFAULT_SCHEMA=dbo  
GO  
CREATE XML SCHEMA COLLECTION MySC AS '  
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns"  
xmlns:ns="http://ns">  
  
   <simpleType name="ListOfIntegers">  
      <list itemType="integer"/>  
   </simpleType>  
  
   <element name="root" type="ns:ListOfIntegers"/>  
  
   <element name="gRoot" type="gMonth"/>  
  
</schema>  
'  
GO  
-- schemaUser cannot see the contents of the collection.  
SETUSER 'schemaUser'  
GO  
SELECT XML_SCHEMA_NAMESPACE(N'dbo',N'MySC')  
GO  
  
-- Grant schemaUser VIEW DEFINITION and REFERENCES permissions  
-- on the XML schema collection.  
SETUSER  
GO  
GRANT VIEW DEFINITION ON XML SCHEMA COLLECTION::dbo.MySC TO schemaUser  
GO  
GRANT REFERENCES ON XML SCHEMA COLLECTION::dbo.MySC TO schemaUser  
GO  
-- Now schemaUser can see the content of the collection.  
SETUSER 'schemaUser'  
GO  
SELECT XML_SCHEMA_NAMESPACE(N'dbo',N'MySC')  
GO  
-- Revoke schemaUser VIEW DEFINITION permissions  
-- on the XML schema collection.  
SETUSER  
GO  
REVOKE VIEW DEFINITION ON XML SCHEMA COLLECTION::dbo.MySC FROM schemaUser  
GO  
-- Now schemaUser cannot see the contents of   
-- the collection.  
setuser 'schemaUser'  
GO  
SELECT XML_SCHEMA_NAMESPACE(N'dbo',N'MySC')  
GO  

Siehe auch

XML-Daten (SQL Server)
Vergleichen von typisiertem XML mit nicht typisiertem XML
XML-Schemaauflistungen (SQL Server)
Anforderungen und Einschränkungen für XML-Schemasammlungen auf dem Server