Поделиться через


Запрет разрешений для коллекции схем XML

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Можно запретить разрешение либо на создание новой коллекции XML-схем, либо на использование уже существующей.

Запретить разрешение на создание коллекции схем XML

Запретить разрешение на создание коллекции XML-схем можно одним из следующих способов.

  • Запретите разрешение ALTER на реляционную схему.

  • Запретите разрешение CONTROL на реляционную схему, чтобы запретить все разрешения на реляционную схему и на все содержащиеся в ней объекты.

  • Запретить ALTER ANY SCHEMA в базе данных. В этом случае субъект не может создать коллекцию схем XML в любом месте базы данных. Обратите внимание на то, что при запрете разрешений ALTER или CONTROL на базу данных происходит запрет всех разрешений на все объекты базы данных.

Запрет разрешений для объекта коллекции схем XML

Далее приводятся разрешения, которые могут быть запрещены на существующие коллекции XML-схем, а также последствия таких запретов.

  • Запрет разрешения ALTER запрещает участнику изменять содержание коллекции XML-схем.

  • Запрет разрешения CONTROL запрещает участнику выполнять любые действия с коллекцией XML-схем.

  • Лишение разрешения REFERENCES лишает пользователя возможности задавать тип или ограничивать типы столбцов и параметры XML с использованием коллекции XML-схем. При этом участнику запрещается ссылаться на эту коллекцию XML-схем из других коллекций XML-схем.

  • Запрет разрешения VIEW DEFINITION запрещает участнику просматривать содержание коллекции XML-схем.

  • Запрет разрешения EXECUTE запрещает участнику вставлять или обновлять значения в столбцах, переменные и параметры, типизированные или ограниченные коллекцией XML-схем. Также это лишает основного субъекта возможности запрашивать значения в тех же столбцах и переменных типа xml.

Примеры

В следующих примерах показан принцип работы разрешений на XML-схемы. В каждом примере создается соответствующая тестовая база данных, реляционные схемы и имена входа. Учетным записям предоставляются необходимые разрешения на коллекции XML-схем. Каждый пример выполняет необходимые действия по очистке в конце.

А. Запрет пользователю создавать коллекции схем XML

Одним из способов запретить пользователю создавать коллекции XML-схем является запрет разрешения ALTER на реляционную схему. Это показано в следующем примере.

В данном примере создается пользователь TestLogin1и база данных. Кроме того, в дополнение к схеме dbo в базе данных создается реляционная схема. Поначалу разрешение CREATE XML SCHEMA позволяет пользователю создавать коллекцию схем в любом месте базы данных. В примере пользователю отказывается в разрешении на одну из реляционных схем. При этом пользователю запрещается создавать коллекции XML-схем в этой реляционной схеме.

CREATE LOGIN TestLogin1 WITH password='SQLSvrPwd1';
GO
CREATE DATABASE SampleDBForSchemaPermissions;
GO
USE SampleDBForSchemaPermissions;
GO
-- Create another relational schema in the database.
CREATE SCHEMA myOtherDBSchema;
GO
CREATE USER TestLogin1;
GO
-- For TestLogin1 to create/import XML schema collection, following
-- permission needed.
-- Database-level permissions
GRANT CREATE XML SCHEMA COLLECTION TO TestLogin1;
GO
GRANT ALTER ANY SCHEMA TO TestLogin1;
GO
-- Now TestLogin1 can import an XML schema collection.
SETUSER 'TestLogin1';
GO
CREATE XML SCHEMA COLLECTION myOtherDBSchema.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="telephone" type="xsd:string" />
</xsd:schema>';
GO
DROP XML SCHEMA COLLECTION myOtherDBSchema.myTestSchemaCollection;
GO
-- Now deny permission from TestLogin1 to alter myOtherDBSchema.
SETUSER;
GO
DENY ALTER ON SCHEMA::myOtherDBSchema TO TestLogin1;
GO
-- Now TestLogin1 cannot create xml schema collection.
SETUSER 'TestLogin1';
GO
CREATE XML SCHEMA COLLECTION myOtherDBSchema.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="telephone" type="xsd:string" />
</xsd:schema>';
GO
-- Final cleanup
SETUSER;
GO
USE master;
GO
DROP DATABASE SampleDBForSchemaPermissions;
GO
DROP LOGIN TestLogin1;
GO

B. Запрет разрешений на коллекцию схем XML

В следующем примере показано, как запретить разрешение для имени входа на существующую коллекцию XML-схем. В этом примере запрещается разрешение REFERENCES для тестового имени входа на существующую коллекцию XML-схем.

В данном примере создается пользователь TestLogin1и база данных. Кроме того, в дополнение к схеме dbo в базе данных создается реляционная схема. Поначалу разрешение CREATE XML SCHEMA позволяет пользователю создавать коллекцию схем в любом месте базы данных.

Разрешение REFERENCES на коллекцию XML-схем позволяет TestLogin1 использовать схему при создании столбца с заданным типом xml в таблице. Если разрешение REFERENCES коллекции XML-схем запрещено, то пользователь TestLogin1 не может использовать ее.

CREATE LOGIN TestLogin1 WITH password='SQLSvrPwd1';
GO
CREATE DATABASE SampleDBForSchemaPermissions;
GO
USE SampleDBForSchemaPermissions;
GO
-- Create another relational schema in the database.
CREATE SCHEMA myOtherDBSchema;
GO
CREATE USER TestLogin1;
GO
-- For TestLogin1 to create/import XML schema collection, the following
-- permission is required.
-- Database-level permissions
GRANT CREATE XML SCHEMA COLLECTION TO TestLogin1;
GO
GRANT ALTER ANY SCHEMA TO TestLogin1;
GO
-- Now TestLogin1 can import an XML schema collection.
SETUSER 'TestLogin1';
GO
CREATE XML SCHEMA COLLECTION myOtherDBSchema.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="telephone" type="xsd:string" />
</xsd:schema>';
GO
-- Grant permission to TestLogin1 to create a table and reference the XML schema collection.
SETUSER;
GO
GRANT CREATE TABLE TO TestLogin1;
GO
-- The user also needs REFERENCES permission to use the XML schema collection
-- to create a typed XML column (REFERENCES permission on the schema
-- collection is not needed).
GRANT REFERENCES ON XML SCHEMA COLLECTION::myOtherDBSchema.myTestSchemaCollection
TO TestLogin1;
GO

--TestLogin1 can use the schema.
CREATE TABLE T(i int, x xml (myOtherDBSchema.myTestSchemaCollection));
GO
-- Drop the table.
DROP TABLE T;
GO
-- Now deny REFERENCES permission to TestLogin1 on the schema created previously.
SETUSER;
GO
DENY REFERENCES ON XML SCHEMA COLLECTION::myOtherDBSchema.myTestSchemaCollection TO TestLogin1;

GO
-- Now TestLogin1 cannot create xml schema collection
SETUSER 'TestLogin1';
GO
-- Following statement fails. TestLogin1 does not have REFERENCES
-- permission on the XML schema collection.
CREATE TABLE T(i int, x xml (myOtherDBSchema.myTestSchemaCollection));
GO

-- Final cleanup
SETUSER;
GO
USE master;
GO
DROP DATABASE SampleDBForSchemaPermissions;
GO
DROP LOGIN TestLogin1;
GO

См. также