拒绝对 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 架构集合权限。 每个示例在末尾执行必要的清理。

答: 阻止用户创建 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="http://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="http://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 该权限允许用户在数据库中的任意位置创建架构集合。

XML REFERENCES 架构集合的权限允许 TestLogin1 使用架构在表中创建类型 xml 化列。 REFERENCES如果拒绝对 XML 架构集合的权限,它将阻止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="http://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  

另请参阅

类型化的 XML 与非类型化的 XML 的比较
XML 架构集合 (SQL Server)
服务器上的 XML 架构集合的要求和限制
DENY 对象权限 (Transact-SQL)
GRANT 对象权限 (Transact-SQL)
XML 数据 (SQL Server)