Delen via


Machtigingen verlenen voor een XML-schemaverzameling

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

U kunt machtigingen verlenen voor het maken van een XML-schemaverzameling en ook machtigingen verlenen voor een XML-schemaverzamelingsobject.

Machtiging verlenen om een XML-schemaverzameling te maken

Als u een XML-schemaverzameling wilt maken, zijn de volgende machtigingen vereist:

  • Voor de principal is de machtiging CREATE XML SCHEMA COLLECTION vereist op databaseniveau.

  • Omdat de XML-schemaverzamelingen op het niveau van een relationeel schema zijn, moet de principal ook ALTER-machtiging hebben voor het relationele schema.

Met de volgende machtigingen kan een principal een XML-schemaverzameling maken in een relationeel schema in een database op een server:

  • Control-machtiging op de server

  • ALTER ANY DATABASE (wijzig alle databases)-machtiging op de server

  • ALTER-machtiging voor de database

  • Beheerrechten in de database

  • Machtiging voor het wijzigen van elk schema en machtiging voor het maken van een XML-schema-verzameling in de database

  • ALTER- of CONTROL-machtiging op het relationele schema en XML-SCHEMAVERZAMELINGCREËER-machtiging in de database

Deze laatste methode van machtigingen wordt gebruikt in het volgende voorbeeld.

De eigenaar van het relationele schema wordt de eigenaar van de XML-schemaverzameling die in dat schema is gemaakt. Deze eigenaar heeft vervolgens volledige controle over de XML-schemaverzameling. Daarom kan deze eigenaar de XML-schemaverzameling wijzigen, een XML-kolom typen of de XML-schemaverzameling verwijderen.

Machtigingen verlenen voor een XML-schemaverzamelingsobject

De volgende machtigingen zijn toegestaan voor de XML-schemaverzameling:

  • De machtiging ALTER is vereist bij het wijzigen van de inhoud van een bestaande XML-schemaverzameling met behulp van de instructie ALTER XML SCHEMA COLLECTION.

  • Met de machtiging CONTROL kan een gebruiker elke bewerking uitvoeren op de XML-schemaverzameling.

  • De machtiging TAKE OWNERSHIP is vereist om het eigendom van de XML-schemaverzameling van de ene principal naar de andere over te dragen.

  • Met de machtiging REFERENCES kan de principal de XML-schemaverzameling gebruiken om xml- kolommen te typen of te beperken, in tabellen en weergaven en parameters. De machtiging VERWIJZINGEN is ook vereist wanneer de ene XML-schemaverzameling naar een andere verwijst.

  • Met de machtiging VIEW DEFINITION kan de principal een query uitvoeren op de inhoud van een XML-schemaverzameling via XML_SCHEMA_NAMESPACE of via de catalogusweergaven, mits deze principal ook een van de machtigingen ALTER, REFERENCES of CONTROL heeft voor de verzameling.

  • De MACHTIGING EXECUTE is vereist om waarden te valideren die door de principal zijn ingevoegd of bijgewerkt op basis van de XML-schemaverzameling die de xml- typekolommen, variabelen en parameters typt of beperkt. U hebt deze machtiging ook nodig wanneer u een query uitvoert op de XML die is opgeslagen in deze kolommen en variabelen.

Voorbeelden

In de scenario's in de volgende voorbeelden ziet u hoe machtigingen voor XML-schema's werken. In elk voorbeeld worden de benodigde testdatabase, relationele schema's en aanmeldingen gemaakt. Aan deze aanmeldingen worden de benodigde machtigingen voor het verzamelen van XML-schema's verleend. Elk voorbeeld voert de benodigde opschoning aan het einde uit.

Een. Machtigingen verlenen om een XML-schemaverzameling te maken

In het volgende voorbeeld ziet u hoe u machtigingen kunt verlenen, zodat een principal een XML-schemaverzameling kan maken. In het voorbeeld worden een voorbeelddatabase en een testgebruiker gemaakt, TestLogin1. TestLogin1 krijgt vervolgens ALTER machtiging voor het relationele schema en CREATE XML SCHEMA COLLECTION machtiging voor de database. Met deze machtigingen slaagt TestLogin1 in het maken van een xml-voorbeeldschemaverzameling.

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. Machtiging verlenen voor het gebruik van een bestaande XML-schemaverzameling

In het volgende voorbeeld ziet u het machtigingsmodel voor de XML-schemaverzameling. In het voorbeeld ziet u hoe verschillende machtigingen zijn vereist voor het maken en gebruiken van de XML-schemaverzameling.

In het voorbeeld worden een testdatabase en een aanmelding gemaakt, TestLogin1. TestLogin1 maakt een XML-schemaverzameling in de database. Het inloggen maakt vervolgens een tabel en maakt gebruik van de XML-schema-collectie om een getypte XML-kolom te maken. De gebruiker voegt vervolgens gegevens in en voert er query's op uit. Voor al deze stappen zijn de benodigde schemamachtigingen vereist, zoals wordt weergegeven in de code.

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. ALTER-machtiging verlenen voor een XML-schemaverzameling

Een gebruiker moet de machtiging ALTER hebben om een bestaande XML-schemaverzameling in de database te wijzigen. In het volgende voorbeeld ziet u hoe u ALTER machtiging kunt verlenen.

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. TAKE OWNERSHIP-machtiging verlenen voor een XML-schemaverzameling

In het volgende voorbeeld ziet u hoe u het eigendom van een XML-schema van de ene gebruiker naar de andere overbrengt. Om het voorbeeld interessanter te maken, werken de gebruikers in dit voorbeeld in verschillende standaard relationele schema's.

In dit voorbeeld doet u het volgende:

  • Hiermee maakt u een database met twee relationele schema's, dbo en myOtherDBSchema).

  • Hiermee maakt u twee gebruikers, TestLogin1 en TestLogin2. TestLogin2 wordt de eigenaar van het relationele myOtherDBSchema schema gemaakt.

  • TestLogin1 maakt een XML-schemaverzameling in het dbo relationele schema.

  • TestLogin1 geeft TAKE OWNERSHIP machtiging voor de XML-schemaverzameling aan TestLogin2.

  • TestLogin2 wordt de eigenaar van de XML-schemaverzameling in myOtherDBSchema, zonder het relationele schema van de XML-schemaverzameling te wijzigen.

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. VIEW DEFINITION-machtiging verlenen voor een XML-schemaverzameling

In het volgende voorbeeld ziet u hoe u VIEW DEFINITION-machtigingen kunt verlenen voor een XML-schemaverzameling.

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

Zie ook