Udostępnij za pośrednictwem


Udzielanie uprawnień do kolekcji schematów XML

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Możesz przyznać uprawnienia do tworzenia kolekcji schematów XML, a także przyznać uprawnienia do obiektu kolekcji schematów XML.

Udzielanie uprawnień do tworzenia kolekcji schematów XML

Aby utworzyć kolekcję schematów XML, wymagane są następujące uprawnienia:

  • Principal wymaga uprawnienia CREATE XML SCHEMA COLLECTION na poziomie bazy danych.

  • Ze względu na to, że kolekcje schematów XML mają zakres schematu relacyjnego, principal musi także posiadać uprawnienia ALTER w ramach tego schematu relacyjnego.

Następujące uprawnienia umożliwiają użytkownikowi utworzenie kolekcji schematów XML w schemacie relacyjnym w bazie danych na serwerze.

  • Uprawnienie CONTROL na serwerze

  • Uprawnienia ALTER ANY DATABASE na serwerze

  • Uprawnienie ALTER w bazie danych

  • Uprawnienie CONTROL w bazie danych

  • Uprawnienie ALTER ANY SCHEMA oraz CREATE XML SCHEMA COLLECTION w bazie danych

  • Uprawnienie ALTER lub CONTROL w schemacie relacyjnym oraz uprawnienie CREATE XML SCHEMA COLLECTION w bazie danych

Ta ostatnia metoda uprawnień jest używana w poniższym przykładzie.

Właściciel schematu relacyjnego staje się właścicielem kolekcji schematów XML utworzonej w tym schemacie. Ten właściciel ma pełną kontrolę nad kolekcją schematów XML. W związku z tym ten właściciel może zmodyfikować kolekcję schematów XML, wpisać kolumnę xml lub usunąć kolekcję schematów XML.

Udzielanie uprawnień do obiektu kolekcji schematów XML

Następujące uprawnienia są dozwolone w kolekcji schematów XML:

  • Uprawnienie ALTER jest wymagane podczas modyfikowania zawartości istniejącej kolekcji schematów XML przy użyciu instrukcji ALTER XML SCHEMA COLLECTION.

  • Uprawnienie CONTROL umożliwia użytkownikowi wykonywanie dowolnej operacji w kolekcji schematów XML.

  • Uprawnienie TAKE OWNERSHIP jest wymagane do przeniesienia własności kolekcji schematów XML z jednego użytkownika do innego.

  • Uprawnienie REFERENCES autoryzuje podmiot zabezpieczeń do używania kolekcji schematów XML do typowania i ograniczania kolumn typu XML w tabelach, widokach i parametrach. Uprawnienie REFERENCES jest również wymagane, gdy jedna kolekcja schematów XML odwołuje się do innej.

  • Uprawnienie WYŚWIETL DEFINICJĘ umożliwia podmiotowi zabezpieczeń wykonywanie zapytań dotyczących zawartości kolekcji schematów XML za pośrednictwem XML_SCHEMA_NAMESPACE lub widoków wykazu, pod warunkiem że ten podmiot zabezpieczeń ma również jedno z uprawnień ALTER, REFERENCES lub CONTROL w kolekcji.

  • Uprawnienie EXECUTE jest wymagane do sprawdzania poprawności wartości wstawionych lub zaktualizowanych przez podmiot względem kolekcji schematów XML, który definiuje lub ogranicza kolumny, zmienne i parametry typu xml. To uprawnienie jest również potrzebne podczas wykonywania zapytań dotyczących kodu XML przechowywanego w tych kolumnach i zmiennych.

Przykłady

Scenariusze w poniższych przykładach ilustrują sposób działania uprawnień schematu XML. W każdym przykładzie tworzona jest niezbędna testowa baza danych, schematy relacyjne i identyfikatory logowania. Tym identyfikatorom logowania przyznano niezbędne uprawnienia do kolekcji schematów XML. Każdy przykład wykonuje niezbędne czyszczenie na końcu.

A. Udzielanie uprawnień do tworzenia kolekcji schematów XML

W poniższym przykładzie pokazano, jak udzielić uprawnień, aby podmiot mógł utworzyć kolekcję schematów XML. W przykładzie zostanie utworzona przykładowa baza danych i użytkownik testowy TestLogin1. TestLogin1 otrzymuje następnie ALTER uprawnienia do schematu relacyjnego i CREATE XML SCHEMA COLLECTION uprawnienia do bazy danych. Dzięki tym uprawnieniom TestLogin1 pomyślnie tworzy przykładową kolekcję schematów XML.

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="https://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="https://schemas.adventure-works.com/Contact/Record
                          https://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. Udzielanie uprawnień do korzystania z istniejącej kolekcji schematów XML

W poniższym przykładzie pokazano również model uprawnień dla kolekcji schematów XML. W przykładzie pokazano, jak różne uprawnienia są wymagane do utworzenia i użycia kolekcji schematów XML.

W przykładzie zostanie utworzona testowa baza danych i login TestLogin1. TestLogin1 tworzy kolekcję schematów XML w bazie danych. Następnie logowanie tworzy tabelę i używa kolekcji schematów XML do utworzenia typowanej kolumny XML. Następnie użytkownik wprowadza dane i dokonuje ich zapytania. Aby wykonać wszystkie te kroki, wymagane są niezbędne uprawnienia schematu, co pokazano w kodzie.

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="https://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="https://schemas.adventure-works.com/Contact/Record
                          https://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 "https://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 "https://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. Udzielanie uprawnień ALTER w kolekcji schematów XML

Użytkownik musi mieć uprawnienie ALTER, aby zmodyfikować istniejącą kolekcję schematów XML w bazie danych. W poniższym przykładzie pokazano, jak udzielić ALTER uprawnień.

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="https://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="https://schemas.adventure-works.com/Contact/Record
                          https://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="https://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. Udzielanie uprawnień TAKE OWNERSHIP w kolekcji schematów XML

W poniższym przykładzie pokazano, jak przenieść własność schematu XML od jednego użytkownika do innego. Aby uczynić przykład bardziej interesującym, użytkownicy w tym przykładzie pracują w różnych domyślnych schematach relacyjnych.

Ten przykład robi następujące:

  • Tworzy bazę danych z dwoma schematami relacyjnymi, dbo i myOtherDBSchema).

  • Tworzy dwóch użytkowników, TestLogin1 i TestLogin2. TestLogin2 jest właścicielem schematu relacyjnego myOtherDBSchema.

  • TestLogin1 tworzy kolekcję schematów XML w schemacie relacyjnym dbo.

  • TestLogin1 następnie daje TAKE OWNERSHIP uprawnienia do kolekcji schematów XML na TestLogin2.

  • TestLogin2 staje się właścicielem kolekcji schematów XML w myOtherDBSchema, bez zmiany schematu relacyjnego kolekcji schematów XML.

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="https://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="https://schemas.adventure-works.com/Contact/Record
                          https://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 they 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. Nadaj uprawnienia VIEW DEFINITION dla kolekcji schematów XML

W poniższym przykładzie pokazano, jak udzielić uprawnień VIEW DEFINITION dla kolekcji schematów XML.

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

Zobacz też