撤销对 XML 架构集合的权限

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

可以使用下列一种方法撤消创建 XML 架构集合的权限:

  • 撤消对关系架构的 ALTER 权限。 这样,主体就不能在关系架构中创建 XML 架构集合。 但是,主体仍然可以在同一数据库的其他关系架构中执行此操作。

  • 撤消主体对数据库的 ALTER ANY SCHEMA 权限。 这样,主体就不能在数据库中的任何位置创建 XML 架构集合。

  • 撤消主体对数据库的 CREATE XML SCHEMA COLLECTION 或 ALTER XML SCHEMA COLLECTION 权限。 这样,主体就无法在数据库中导入 XML 架构集合。 撤消对数据库的 ALTER 或 CONTROL 权限效果相同。

撤销对现有 XML 架构集合对象的权限

下列是可以对 XML 架构集合撤消的权限及相应结果:

  • ALTER 权限,撤消后,主体无法修改 XML 架构集合的内容。

  • TAKE OWNERSHIP 权限,撤消后,主体无法传输 XML 架构集合的所有权。

  • REFERENCES 权限,撤消后,主体无法使用 XML 架构集合类型化或约束 xml 类型列(表和视图中)和参数。 它还撤消了从其他 XML 架构集合中引用此架构集合的权限。

  • VIEW DEFINITION 权限,撤消后,主体无法查看 XML 架构集合的内容。

  • EXECUTE 权限,撤消后,主体无法在通过 XML 集合类型化或约束的列、变量和参数中插入或更新值。 它还撤消了查询这类 xml 类型列、变量或参数的功能。

示例

以下示例中的应用场景说明 XML 架构权限的工作机制。 每个示例都创建有必需的测试数据库、关系架构和登录帐户。 这些登录帐户已授予必需的 XML 架构集合权限。 每个示例在结束时都会进行必要的清除操作。

A. 撤销创建 XML 架构集合的权限

该示例创建了一个登录帐户和一个示例数据库。 并在数据库中添加了一个关系架构。 首先,为登录帐户授予对两个关系架构的 ALTER 权限和其他所需权限,以创建 XML 架构集合。 然后,该示例撤消了对数据库中一个关系架构的 ALTER 权限。 这使得登录帐户无法创建 XML 架构集合。

SETUSER;
GO
CREATE LOGIN TestLogin1 with password='SQLSvrPwd1';
GO
CREATE DATABASE SampleDBForSchemaPermissions;
GO
use SampleDBForSchemaPermissions;
GO
-- Create another relational schema in the db (in addition to dbo schema)
CREATE SCHEMA myOtherDBSchema;
GO
CREATE USER TestLogin1;
GO
-- For TestLogin1 to create/import XML schema collection, following
-- permission needed
-- CREATE XML SCHEMA is a database level permission
GRANT CREATE XML SCHEMA COLLECTION TO TestLogin1;
GO
GRANT ALTER ON SCHEMA::myOtherDBSchema TO TestLogin1;
GO
GRANT ALTER ON SCHEMA::dbo TO TestLogin1;
GO
-- Now TestLogin1 can import an XML schema collection in both relational schemas.
SETUSER 'TestLogin1';
GO
CREATE XML SCHEMA COLLECTION dbo.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
-- TestLogin1 can create XML schema collection in myOtherDBSchema relational schema
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
-- Let us drop XML schema collections from both relational schemas
DROP XML SCHEMA COLLECTION myOtherDBSchema.myTestSchemaCollection;
GO
DROP XML SCHEMA COLLECTION dbo.myTestSchemaCollection;
GO
-- now REVOKE permission from TestLogin1 to alter myOtherDBSchema
SETUSER;
GO
REVOKE ALTER ON SCHEMA::myOtherDBSchema FROM TestLogin1;
GO
-- now TestLogin1 cannot create xml schema collection in myOtherDBSchema
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

-- TestLogin1 can still create XML schema collections in dbo
-- It cannot create XML schema collections anywhere in the database
-- if we REVOKE CREATE XML SCHEMA COLLECTION permission
SETUSER;
GO
REVOKE CREATE XML SCHEMA COLLECTION FROM TestLogin1;
GO

SETUSER 'TestLogin1';
GO
-- the following now should fail
CREATE XML SCHEMA COLLECTION dbo.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

另请参阅