Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
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:
Podmiot zabezpieczeń wymaga CREATE XML SCHEMA COLLECTION uprawnień 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 do serwera
Uprawnienie ALTER w bazie danych
Uprawnienie CONTROL w bazie danych
uprawnienie ALTER ANY SCHEMA i uprawnienie CREATE XML SCHEMA COLLECTION w bazie danych
Uprawnienie ALTER lub CONTROL do schematu relacyjnego 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 VIEW DEFINITION umożliwia podmiotowi zabezpieczeń wysyłanie zapytań dotyczących zawartości kolekcji schematów XML za pośrednictwem XML_SCHEMA_NAMESPACE lub widoków katalogowych, pod warunkiem że dany podmiot zabezpieczeń ma również jedno z uprawnień ALTER, REFERENCES lub CONTROL do tej 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,
dboimyOtherDBSchema).Tworzy dwóch użytkowników,
TestLogin1iTestLogin2.TestLogin2jest właścicielem schematu relacyjnegomyOtherDBSchema.TestLogin1tworzy kolekcję schematów XML w schemacie relacyjnymdbo.TestLogin1następnie dajeTAKE OWNERSHIPuprawnienia do kolekcji schematów XML naTestLogin2.TestLogin2staje się właścicielem kolekcji schematów XML wmyOtherDBSchema, 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. Udzielenie VIEW uprawnienia DEFINITION do kolekcji schematów XML
W poniższym przykładzie pokazano, jak nadać VIEW uprawnienie DEFINITION do 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='<password>',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