Share via


撤銷 XML 結構描述集合的權限

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

建立 XML 結構描述集合的權限可以使用下列其中一種方式來撤銷:

  • 撤銷關聯式結構描述的 ALTER 權限。 然後,主體便無法在關聯式結構描述中建立 XML 結構描述集合。 但是,主體仍然可以在同一資料庫的其他關聯式結構描述中建立 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 類型的資料行和參數 (資料行限於資料表和檢視)。 這樣也會撤銷從其他 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

另請參閱