共用方式為


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

建立 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="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
-- 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="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
-- 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="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

-- 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="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