拒绝对 XML 架构集合的权限

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

可以拒绝创建新 XML 架构集合或使用现有 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 架构集合权限。 每个示例在结束时都会进行必要的清除操作。

A. 禁止用户创建 XML 架构集合

禁止用户创建 XML 架构集合的一个方法是拒绝对关系架构的 ALTER 权限。 这在下面的示例中显示。

该示例创建了一个用户 TestLogin1和一个数据库。 除 dbo 架构外,它还在数据库中创建了一个关系架构。 最初, CREATE XML SCHEMA 权限允许用户在数据库的任何位置创建架构集合。 然后,该示例拒绝用户对其中一个关系架构拥有 ALTER 权限。 这就禁止了用户在该关系架构中创建 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 架构集合拥有特定权限。 在本例中,拒绝了测试登录名对现有 XML 架构集合的 REFERENCES 权限。

该示例创建了一个用户 TestLogin1和一个数据库。 除 dbo 架构外,它还在数据库中创建了一个关系架构。 最初, CREATE XML SCHEMA 权限允许用户在数据库的任何位置创建架构集合。

REFERENCES 利用对 XML 架构集合的 TestLogin1 权限使用架构在表中创建 xml 类型的列。 如果对 XML 架构集合的 REFERENCES 权限被拒绝,将禁止 TestLogin1 使用 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, 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

另请参阅