資料庫 mysql 跨庫訪問 資料庫跨庫訪問問題

2021-10-19 21:10:59 字數 2374 閱讀 9665

sql server中的所有權鏈及其問題

沒有多少朋友對所有權鏈真的理解的。我自己有時候經常回過來看看這些資料,覺得還是很有意思的。下面的內容摘自微軟文件,介紹得比較好

簡而言之

1. 如果在同乙個資料庫中,只要兩個物件的所有者是一樣的,

那麼他們之間的訪問是不檢查訪問者身份的。

例如乙個檢視和乙個表是屬於同乙個所有者,

那麼只要使用者有訪問檢視的許可權,就等於擁有了訪問表的許可權,即便在表上面明確拒絕了使用者的許可權。

你可能會奇怪了,我們不是經常講「拒絕優先」嗎?沒錯,拒絕優先是對的,但事情的關鍵主要在於這個時候,

sql server根本就不檢查許可權了,當然就不存在任何問題。

這個特性可能在規劃安全時很有用

2. 如果在不同資料庫中,也可以實現與上面同樣的所有權鏈結,此時我們稱為「跨資料庫所有權鏈」。因為有安全隱患,所以預設該選項是被禁用的

--以管理員登入

use master

go---建立兩個資料庫

create database db1

gocreate database db2

go--在第乙個資料庫中新增乙個表,並新增一點資料

use db1

gocreate table table1(id int)

goinsert into table1 values(1);

insert into table1 values(1);

insert into table1 values(1);

insert into table1 values(1);

--在第二個資料庫中新增乙個檢視,讓他去訪問第乙個資料庫中的表

use db2

gocreate view db1table1view

asselect * from db1.dbo.table1

--因為當前使用者是管理員,它會屬於sysadmin角色,所以可以訪問到。即便沒有開啟跨資料庫所有權鏈

select * from db1table1view

--建立乙個login1

create login [login1] with mailto:password=n%27pass@word%27

--將該登入對映到db2,成為乙個使用者

create user [login1] for login [login1];

go--使用該使用者的身份去訪問那個檢視

execute as user = 'login1'

select current_user --此時會切換到login1這個使用者

select * from db1table1view --此時會失敗,因為該使用者不具備對檢視的訪問許可權

--授予使用者對檢視的select 許可權

revert --回到之前的身份,因為要做授權

select current_user --此時的身份會切換回到chenxizhang所代表的使用者,也就是dbo

grant select on [dbo].[db1table1view] to [login1]

--再次切換為login1身份

execute as user ='login1';

select current_user

select * from db1table1view

--此時出現下面這樣的錯誤,說明當前使用者確實試圖去訪問db1的table1,但因為不能進行上下文鏈結,所以還是失敗了

訊息 916,級別 14,狀態 1,第 3 行

伺服器主體 "login1" 無法在當前安全上下文下訪問資料庫 "db1"。

--切換回chenxizhang身份,啟用db1資料庫的所有權鏈結

revert

select current_user

alter database db1 set db_chaining on

alter database db2 set db_chaining on

--再次切換為login1身份

execute as user ='login1';

select current_user

select * from db1table1view

此時仍然出現乙個錯誤。和上面是一樣的。既然實現了所有權鏈結,為什麼還是不行呢?

原因是因為在db1中也要存在該使用者,即他至少要能訪問資料庫

revert

use db1

gocreate user login1 for login [login1]

gouse db2

go--再次切換為login1身份

execute as user ='login1';

select current_user

select * from db1table1view

訪問資料庫 訪問資料庫

程式執行的時候,資料都是在記憶體中的。當程式終止的時候,通常都需要將資料儲存到磁碟上,無論是儲存到本地磁碟,還是通過網路儲存到伺服器上,最終都會將資料寫入磁碟檔案。而如何定義資料的儲存格式就是乙個大問題。如果我們自己來定義儲存格式,比如儲存乙個班級所有學生的成績單 名字成績 michael99 bo...

跨資料庫訪問方法

跨資料庫訪問可以使用database link的方式連線,例如 在paysysdb使用者訪問另一資料庫 不同主機,不同使用者 裡的表 用paysysdb登入sqlplus,並執行 create database link dblink name connect to mdafedb identifi...

SQLServer 跨資料庫訪問

首先,你要知道跨資料庫訪問的語法,如下 select from openrowset sqloledb driver server 伺服器位址 uid sa pwd 密碼 資料庫名.dbo.表名 如果沒有啟用ad hoc distributed queries,查詢結果是出錯的,如下描述 exec ...