Udělení oprávnění pro kolekci schémat XML
platí pro:SQL Server
Azure SQL Database
azure SQL Managed Instance
Můžete udělit oprávnění k vytvoření kolekce schématu XML a také udělit oprávnění k objektu kolekce schématu XML.
Udělení oprávnění k vytvoření kolekce schémat XML
K vytvoření kolekce schémat XML jsou vyžadována následující oprávnění:
Hlavní objekt vyžaduje oprávnění CREATE XML SCHEMA COLLECTION na úrovni databáze.
Vzhledem k tomu, že kolekce schémat XML jsou relačními schématy, musí mít hlavní uživatel také oprávnění ALTER k relačnímu schématu.
Následující oprávnění umožňují subjektu vytvořit kolekci schémat XML v relačním schématu databáze na serveru:
OPRÁVNĚNÍ ŘÍZENÍ na serveru
Oprávnění ALTER ANY DATABASE na serveru
ALTER oprávnění k databázi
OPRÁVNĚNÍ CONTROL v databázi
Oprávnění ALTER ANY SCHEMA a oprávnění CREATE XML SCHEMA COLLECTION v databázi
Oprávnění ALTER nebo CONTROL k relačnímu schématu a oprávnění CREATE XML SCHEMA COLLECTION v databázi
Tato poslední metoda oprávnění se používá v následujícím příkladu.
Vlastník relačního schématu se stane vlastníkem kolekce schémat XML vytvořené v daném schématu. Tento vlastník pak má úplnou kontrolu nad kolekcí schémat XML. Proto může tento vlastník upravit kolekci schémat XML, zadat sloupec XML nebo odstranit kolekci schématu XML.
Udělení oprávnění k objektu kolekce schémat XML
Pro kolekci schémat XML jsou povolená následující oprávnění:
Při úpravě obsahu existující kolekce schémat XML pomocí příkazu ALTER SCHEMA COLLECTION se vyžaduje oprávnění ALTER.
Oprávnění CONTROL umožňuje uživateli provádět jakoukoli operaci v kolekci schémat XML.
K převodu vlastnictví kolekce schémat XML z jednoho objektu zabezpečení do druhého se vyžaduje oprávnění PŘEVZÍT VLASTNICTVÍ.
Oprávnění REFERENCES autorizuje hlavní entitu k použití kolekce schémat XML k zadání nebo omezení sloupců typu xml v tabulkách, zobrazeních a parametrech. Oprávnění REFERENCES se vyžaduje také v případě, že jedna kolekce schématu XML odkazuje na jinou.
Oprávnění VIEW DEFINITION umožňuje subjektu dotazovat obsah kolekce schémat XML buď přes XML_SCHEMA_NAMESPACE, nebo přes katalogová zobrazení, za předpokladu, že tento subjekt má na kolekci jedno z oprávnění ALTER, REFERENCES, nebo CONTROL.
Oprávnění EXECUTE je vyžadováno k ověření hodnot vložených nebo aktualizovaných hlavním objektem podle kolekce schémat XML, která definuje nebo omezuje xml sloupce, proměnné a parametry. Toto oprávnění potřebujete také při dotazování XML uloženého v těchto sloupcích a proměnných.
Příklady
Scénáře v následujících příkladech ukazují, jak fungují oprávnění schématu XML. Každý příklad vytvoří potřebnou testovací databázi, relační schémata a přihlášení. Těmto přihlášením se udělí potřebná oprávnění ke shromažďování schémat XML. Každý příklad provede potřebné vyčištění na konci.
A. Udělení oprávnění k vytvoření kolekce schémat XML
Následující příklad ukazuje, jak udělit přístupová práva, aby se umožnilo objektu zabezpečení vytvořit kolekci schémat XML. Příklad vytvoří ukázkovou databázi a testovacího uživatele TestLogin1
.
TestLogin1
se pak udělí oprávnění ALTER
k relačnímu schématu a oprávnění CREATE XML SCHEMA COLLECTION
k databázi. S těmito oprávněními TestLogin1
úspěšně vytvoří ukázkovou kolekci schématu 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. Udělení oprávnění k použití existující kolekce schémat XML
Následující příklad dále ukazuje model oprávnění pro kolekci schémat XML. Příklad ukazuje, jak se k vytvoření a používání kolekce schémat XML vyžadují různá oprávnění.
Příklad vytvoří testovací databázi a přihlášení TestLogin1
.
TestLogin1
v databázi vytvoří kolekci schémat XML. Přihlašování pak vytvoří tabulku a použije kolekci schémat XML k vytvoření typového xml sloupce. Uživatel pak vloží data a dotazuje se na něj. Všechny tyto kroky vyžadují potřebná oprávnění schématu, jak je znázorněno v kódu.
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. Udělení oprávnění ALTER pro kolekci schémat XML
Uživatel musí mít oprávnění ALTER k úpravě existující kolekce schémat XML v databázi. Následující příklad ukazuje, jak udělit oprávnění ALTER
.
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. Udělení oprávnění PŘEVZÍT VLASTNICTVÍ u kolekce schémat XML
Následující příklad ukazuje, jak přenést vlastnictví schématu XML z jednoho uživatele do druhého. Aby byl příklad zajímavější, uživatelé v tomto příkladu pracují v různých výchozích relačních schématech.
Tento příklad provede následující:
Vytvoří databázi se dvěma relačními schématy,
dbo
amyOtherDBSchema
).Vytvoří dva uživatele,
TestLogin1
aTestLogin2
.TestLogin2
je vlastníkem relačního schématumyOtherDBSchema
.TestLogin1
vytvoří kolekci schémat XML v relačním schématudbo
.TestLogin1
pak udělíTAKE OWNERSHIP
oprávnění ke kolekci schémat XMLTestLogin2
.TestLogin2
se stane vlastníkem kolekce schématu XML vmyOtherDBSchema
, aniž by se změnilo relační schéma kolekce schémat 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. Udělení oprávnění VIEW DEFINITION pro kolekci schémat XML
Následující příklad ukazuje, jak udělit oprávnění VIEW DEFINITION pro kolekci schémat 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