Uwaga
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
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
imyOtherDBSchema
).Tworzy dwóch użytkowników,
TestLogin1
iTestLogin2
.TestLogin2
jest właścicielem schematu relacyjnegomyOtherDBSchema
.TestLogin1
tworzy kolekcję schematów XML w schemacie relacyjnymdbo
.TestLogin1
następnie dajeTAKE OWNERSHIP
uprawnienia do kolekcji schematów XML naTestLogin2
.TestLogin2
staje 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. 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