資料庫中Schema和Database有什麼區別

来源:http://www.cnblogs.com/QQ267307031/archive/2017/07/26/7239762.html
-Advertisement-
Play Games

在MySQL中創建一個Schema好像就跟創建一個Database是一樣的效果, 在SQL Server和Orcal資料庫中好像又不一樣。 目前我只能理解,在mysql中 schema<==>database。 資料庫中User和Schema的關係 假如我們想瞭解資料庫中的User和Schema究竟 ...


  在MySQL中創建一個Schema好像就跟創建一個Database是一樣的效果,   在SQL Server和Orcal資料庫中好像又不一樣。   目前我只能理解,在mysql中 schema<==>database。     資料庫中User和Schema的關係   假如我們想瞭解資料庫中的User和Schema究竟是什麼關係,首先必須瞭解一下資料庫中User和Schema到底是什麼概念。     在SQL Server 2000中,由於架構的原因,User和Schema總有一層隱含的關係,讓我們很少意識到其實User和Schema是兩種完全不同的概念,不過在SQL Server 2005中這種架構被打破了,User和Schema也被分開了。     首先我來做一個比喻,什麼是Database,什麼是Schema,什麼是Table,什麼是列,什麼是行,什麼是User?   我們可以可以把Database看作是一個大倉庫,倉庫分了很多很多的房間,Schema就是其中的房間,一個Schema代表一個房間,Table可以看作是每個Schema中的床,Table(床)就被放入每個房間中,不能放置在房間之外,那豈不是晚上睡覺無家可歸了。然後床上可以放置很多物品,就好比Table上可以放置很多列和行一樣,資料庫中存儲數據的基本單元是Table,現實中每個倉庫放置物品的基本單位就是床, User就是每個Schema的主人,(所以Schema包含的是Object,而不是User),其實User是對應與資料庫的(即User是每個對應資料庫的主人),既然有操作資料庫(倉庫)的權利,就肯定有操作資料庫中每個Schema(房間)的權利,就是說每個資料庫映射的User有每個Schema(房間)的鑰匙,換句話說,如果他是某個倉庫的主人,那麼這個倉庫的使用權和倉庫中的所有東西都是他的(包括房間),他有完全的操作權,可以扔掉不用的東西從每個房間,也可以放置一些有用的東西到某一個房間,呵呵,和現實也太相似了吧。我還可以給User分配具體的許可權,也就是他到某一個房間能做些什麼,是只能看(Read-Only),還是可以像主人一樣有所有的控制權(R/W),這個就要看這個User所對應的角色Role了,至於分配許可權的問題,我留在以後單獨的blog中詳述。比喻到這裡,相信大家都清楚了吧。     在SQL Server2000中,假如我們在某一個資料庫中創建了用戶Bosco,按麽此時後臺也為我們預設地創建了預設Schema 【Bosco】。Schema的名字和User的名字相同,這也是我們分不清楚用戶和Schema的原因。     在SQL Server2005中,為了向後相容,當你用sp_adduser 存儲過程創建一個用戶的時候,SQL Server2005同時也創建了一個和用戶名相同的Schema,然而這個存儲過程是為了向後相容才保留的,我們應該逐漸熟悉用新的DDL語言Create User和Create Schema來操作資料庫。在SQL Server2005中,當我們用Create User創建資料庫用戶時,我們可以為該用戶指定一個已經存在的Schema作為預設Schema,如果我們不指定,則該用戶所預設的Schema即為dbo Schema,dbo 房間(Schema)好比一個大的公共房間,在當前登錄用戶沒有預設Schema的前提下,如果你在大倉庫中進行一些操作,比如Create Tabe,如果沒有指定特定的房間(Schema),那麼你的物品就只好放進公共的dbo房間(Schema)了。但是如果當前登錄用戶有預設的Schema,那麼所做的一切操作都是在預設Schema上進行(比如當前登錄用戶為login1,該用戶的預設Schema為login1,那麼所做的所有操作都是在這個login1預設Schema上進行的。實驗已經證明的確如此)。估計此時你會有一點暈,為什麼呢?我剛纔說dbo是一個Schema,但是你可以在資料庫中查看到,dbo同時也是一個user,暈了吧,呵呵。     在SQL Server2005中創建一個資料庫的時候,會有一些Schema包括進去,被包括進去的Schema有:dbo,INFORMATION_SCHEMA, guest,sys等等(還有一些角色Schema,不提了,有暈了)。     我在上文中已經提到了,在SQL Server2005中當用存儲過程sp_adduser創建一個user時,同時SQL Server2005也為我們創建了一個預設的和用戶名相同的Schema,這個時候問題出來了,當我們create table A時,如果沒有特定的Schema做首碼,這個A表創建在了哪個Schema上,即進入了哪個房間?答案是:     1.如果當前操作資料庫的用戶(可以用Select current_user查出來)有預設的Schema(在創建用戶的時候指定了),那麼表A被創建在了預設的Schema上。     2.如果當前操作資料庫的用戶沒有預設的Schema(即在創建User的時候預設為空),但是有一個和用戶名同名的Schema,那麼表A照樣被創建在了dbo Schema上,即使有一個和用戶名同名的Schema存在,由於它不是該用戶預設的Schema,所以創建表的時候是不會考慮的,當作一般的Schema來處理,別看名字相同,可是沒有任何關係哦。     3.如果在創建表A的時候指定了特定的Schema做首碼,則表A被創建在了指定的 Schema上(有許可權嗎?)     現在問題又出來了,在當前操作資料庫的用戶(用select current_user可以查看到,再次強調)沒有預設Schema的前提下,當我們用Create table A語句時,A表會去尋找dbo Schema,並試圖創建在dbo Schema上,但是如果創建A表的用戶只有對dbo Schema的只讀許可權,而沒有寫的許可權呢?這個時候A表既不是建立不成功,這個就是我以後會提及到的Login,User, Role和Schema四者之間的關係。在這裡,為了避免混淆和提高操作資料庫的速度(在少量數據範圍內,對我們肉眼來說幾乎看不到差異),我們最好每次在操作資料庫對象的時候都顯式地指定特定的Schema最為首碼。     現在如果登錄的用戶為Sue,該用戶有一個預設Schema也為Sue,那麼如果現在有一條查詢語句為Select * from mytable, 那麼搜尋每個房間(Schema)的順序是怎樣的呢?順序如下:    1. 首先搜尋sys.mytable (Sys Schema)    2. 然後搜尋Sue.mytable (Default Schema)    3. 最後搜尋 dbo.mytable (Dbo Schema)    執行的順序大家既然清楚了,那麼以後在查詢資料庫表中的數據時,最好指定特定的Schema首碼,這樣子,資料庫就不用去掃描Sys Schema了,當然可以提高查詢的速度了。    另外需要提示一下的是,每個資料庫在創建後,有4個Schema是必須的(刪都刪不掉),這4個Schema為:dbo,guest,sys和INFORMATION_SCHEMA,其餘的Schema都可以刪除。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、資料庫事務隔離級別 資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個級別可以逐個解決臟讀 、不可重覆讀 、幻讀 這幾類問題。 √: 可能出現 ×: 不會出現 臟讀 不 ...
  • 一、複製的意義 mysql的複製功能是構建基於MySql大規模,高性能應用的基礎,我們可以通過為伺服器配置一個或多個備庫來進行數據同步;複製功能不僅有利於構建高性能的應用,同時也是高可用性,可擴展行,災難恢復,備份以及數據倉庫等工作的基礎 二、複製的方式 Mysql支持3種方式:基於語句的複製、基於 ...
  • 資料庫 資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生於距今六十多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管理的方式。資料庫有很多種類型,從最簡單的存儲有各種數據的表格到能夠進行海量數據存 ...
  • select id,name from htms_center_freight_users where id in(114,112,91,223,134) order by find_in_set(id,'114,91,223,134,112'); ...
  • MySQL MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關 ...
  • Sqoop將mysql數據導入hbase的血與淚(整整搞了大半天) 版權聲明:本文為yunshuxueyuan原創文章。如需轉載請標明出處: https://my.oschina.net/yunshuxueyuan/blogQQ技術交流群:299142667 一、 問題如何產生 龐老師只講解了mys ...
  • oracle存儲過程和存儲函數 指存儲在資料庫中供所有用戶程式調用的子程式叫存儲過程,存儲函數 存儲過程和存儲函數的相同點:完成特定功能的程式 存儲過程和存儲函數的區別:是否用return語句返回值 創建和使用存儲過程 用create procedure命令建立存儲過程和存儲函數 語法: creat ...
  • 對於程式中的string型欄位,SQLServer中有char、varchar、nchar、nvarchar四種類型來對應(暫時不考慮text和ntext),開建立資料庫中,對這四種類型往往比較模糊,這裡做一下對比。 定長或變長 所謂定長就是長度固定的,當輸入的數據長度沒有達到指定的長度時將自動以英 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...