日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

系统命名与 SQL 命名之争 - 第 1 部分

發(fā)布時間:2023/12/9 windows 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 系统命名与 SQL 命名之争 - 第 1 部分 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

創(chuàng)建數(shù)據(jù)庫對象的命名規(guī)范

創(chuàng)建數(shù)據(jù)庫對象時,開發(fā)人員可以選擇一種命名方法,可以選擇遵循傳統(tǒng) IBM i 行為的系統(tǒng)命名模式 (*SYS),也可以選擇遵循SQL 標(biāo)準(zhǔn)規(guī)則的 SQL 命名規(guī)范 (*SQL)。

DB2 for i 與其他數(shù)據(jù)庫管理系統(tǒng) (DBMS) 之間的主要差別在于 DB2 for i 集成于操作系統(tǒng)之中。這種集成使 IBM i 用戶能夠使用自己的操作系統(tǒng)用戶配置文件和相關(guān)的訪問權(quán)限直接訪問 DB2 for i 數(shù)據(jù)庫。其他數(shù)據(jù)庫并未集成到操作系統(tǒng)之中,因此必須定義具有獨(dú)立訪問權(quán)限的特定數(shù)據(jù)庫用戶。

SQL 創(chuàng)建數(shù)據(jù)庫對象時使用的默認(rèn)命名取決于這些 SQL DDL(數(shù)據(jù)定義語言)命令的環(huán)境。

對于所有服務(wù)器端 SQL 環(huán)境(比如用于啟動 SQL 交互會話的 STRSQL 或用來運(yùn)行 SQL 語句的 RUNSQLSTM)以及 HLL(高級語言)程序(比如 RPG 或 COBOL)中的嵌入式 SQL 而言,默認(rèn)命名是系統(tǒng)命名

基于客戶端的 SQL 環(huán)境中使用的默認(rèn)命名值則通常是 SQL 命名,例如 System i Navigator、IBM Rational Developer for Power Systems Software (RDp)、中間件(ODBC、JDBC 等)或第三方 SQL 工具。

為了避免對象權(quán)限和訪問方法匹配不當(dāng),您需要確定在您的應(yīng)用程序環(huán)境中最適合使用的是系統(tǒng)命名還是 SQL 命名。在某些環(huán)境中,您可能需要更改默認(rèn)命名,以匹配您的應(yīng)用程序環(huán)境中使用的命名規(guī)范。

System i Navigator 界面

如果您希望使用 System i Navigator 界面來創(chuàng)建數(shù)據(jù)庫對象,那么可以按照如下方法預(yù)定義要使用的命名:

打開您的連接,右鍵單擊數(shù)據(jù)庫圖標(biāo),選擇 Preferences 任務(wù),如 圖 1. System i Navigator – 設(shè)置首選項(xiàng) 所示。

Preferences 窗口提供了 3 個選項(xiàng)。Connection (all Systems) 選項(xiàng)允許您預(yù)定義要為未來的連接使用的命名規(guī)范。這項(xiàng)設(shè)置也將用作運(yùn)行 SQL 腳本和生成 SQL 執(zhí)行的未來默認(rèn)命名值,但不會影響任何現(xiàn)有窗口。


圖 1. System i Navigator – 設(shè)置首選項(xiàng)

System i Navigator 的運(yùn)行 SQL 腳本工具

如果您希望使用運(yùn)行 SQL 腳本工具來執(zhí)行一個文件內(nèi)存儲的 SQL 腳本或者交互地輸入的 SQL 腳本,那么可以通過單擊 Connection 下拉菜單并選擇 JDBC Setup 任務(wù)來控制命名規(guī)范。可以在 Format 選項(xiàng)卡中設(shè)置命名規(guī)范。


圖 2. System i Navigator – 運(yùn)行 SQL 腳本 - 設(shè)置命名規(guī)范

RUNSQLSTM – 運(yùn)行 SQL 語句

如果您希望通過 RUNSQLSTM (運(yùn)行 SQL 語句)執(zhí)行存儲在源物理文件成員或者 IFS(集成文件系統(tǒng))中的 SQL 語句,那么可以在 RUNSQLSTM 命令中使用 Naming 參數(shù)指定命名規(guī)范,如下例所示。使用 SQL 命名即可執(zhí)行指定的 SQL 腳本。


清單 1. RUNSQLSTM 設(shè)置命名規(guī)范
RUNSQLSTM SRCFILE(MYSCHEMA/QSQLSRC) SRCMBR(MYSCRIPT) NAMING(*SQL)

HLL 程序中的嵌入式 SQL

如果您希望在 RPG 或 COBOL 等 HTLL 程序內(nèi)使用嵌入式 SQL,以便處理您的表中的數(shù)據(jù)庫,或者創(chuàng)建新數(shù)據(jù)庫對象,那么默認(rèn)命名設(shè)置將是系統(tǒng)命名。

如果您希望使用 SQL 命名,那么可以在編譯命令中預(yù)先定義命名規(guī)范(CRTSQLRPGI、CRTSQLCBLI 或者 CRTSQLCI,具體取決于編程模型),如下例所示:


清單 2. 創(chuàng)建一個使用 SQL 命名的嵌入式 SQL 程序
CRTSQLRPGI OBJ(MYPGMLIB/MYSQLPGM) SRCFILE(MYSRCLIB/QRPGLESRC) SRCMBR(MYMBR) OPTION(*SQL)

除了在編譯命令中指定命名方法之外,還可以將其包含在您的源代碼之中,只需添加一條 SET OPTION 語句即可(如下例所示)。SET OPTION 語句必須是源代碼中的第一條語句,并且包含您希望設(shè)置的所有選項(xiàng)。


清單 3. 設(shè)置命名規(guī)范的 SET OPTION 語句
/Free Exec SQL Set Option Commit=*NONE, Naming=*SQL DatFmt=*ISO, CloSQLCsr=*ENDACTGRP; //All other source code including embedded SQL statements /End-Free

IBM i Access for Windows ODBC 驅(qū)動程序

可以使用 IBM i Access for Windows - ODBC 管理界面或連接關(guān)鍵字,為 ODBC 連接指定命名規(guī)范。

下一張圖展示了在 ODBC 管理界面的 Server 選項(xiàng)卡中控制的命名規(guī)范。


圖 3. ODBC 設(shè)置

JDBC 訪問

可以通過在連接 URL 中指定 JDBC 驅(qū)動程序的連接屬性來控制 JDBC 訪問命名規(guī)范。

naming 屬性的連接屬性支持使用 sql 和 system 值來指定命名規(guī)范。默認(rèn)設(shè)置為 SQL 命名。

使用系統(tǒng)命名時,可以使用 libraries 屬性預(yù)定義一個庫列表,如下例所示。


清單 4. JDBC 設(shè)置命名規(guī)范
conn = DriverManager.getConnection("jdbc:db2:*local: ... ... naming=system;libraries=MYLIBA,MYLIBB,MYLIBX");

IBM i Access for Windows ADO.NET 提供程序

使用 ADO.NET 時,可在建立連接時設(shè)置系統(tǒng)命名的命名規(guī)范和庫列表。iDB2Connection 對象連接到 DB2 for i。命名規(guī)范以連接字符串屬性的形式提供。

以下代碼展示了如何為 iDB2Connection 對象設(shè)置系統(tǒng)命名和庫列表:


清單 5. ADO.NET 設(shè)置命名規(guī)范
iDB2Connection conn = new iDB2Connection("DataSource=abc; userid=XXX;password=YYY; Naming=System; LibraryList=*USRLIBL,MYLIB");

SQL CLI - 調(diào)用級接口

使用 SQL CLI 函數(shù)時,命名規(guī)范是一個可以通過執(zhí)行 SQLSetConnectAttr 函數(shù)設(shè)置的屬性。為了將命名規(guī)范設(shè)置為系統(tǒng)命名,必須將 SQL_ATTR_DBC_SYS_NAMING 常量傳遞給屬性參數(shù),并將 SQL_TRUE 常量傳遞給屬性值參數(shù),如下例所示。


清單 6. 使用 SQLCLI 設(shè)置連接屬性
rc = SQLSetConnectAttr(ConnHandle: SQL_ATTR_DBC_SYS_NAMING: SQL_TRUE: 4);

STRSQL – 啟動 SQL 交互會話

如果您希望更改在交互式 SQL 中運(yùn)行 SQL 語句所用的命名,可執(zhí)行 STRSQL CL 命令,按下功能鍵 F13=Services,并選擇選項(xiàng) 1(更改會話屬性)。

回頁首

架構(gòu) – 包含數(shù)據(jù)庫對象的容器

架構(gòu)就是用于存儲數(shù)據(jù)庫對象的容器。在 IBM i 中,架構(gòu)這個術(shù)語的用法等同于庫。

架構(gòu)或庫均可使用 CRTLIB(創(chuàng)建庫)CL 命令或 CREATE SCHEMA SQL 語句創(chuàng)建。CRTLIB 命令僅創(chuàng)建一個空容器,SQL 語句則將自動添加一個日志、一個日志接收器和一些包含有關(guān)此架構(gòu)中的所有數(shù)據(jù)庫對象的信息的目錄視圖。

使用 CRTLIB 命令創(chuàng)建庫時,庫的所有者可以是創(chuàng)建庫的用戶配置文件,也可以是組配置文件。

庫的所有者是用戶還是組配置文件取決于用戶配置文件的 OWNER 選項(xiàng)設(shè)置。如果 OWNER 選項(xiàng)設(shè)置為 *GRPPRF,則 GRPPRF 選項(xiàng)中指定的用戶配置文件將成為該用戶創(chuàng)建的所有對象的所有者,否則用戶配置文件將成為對象所有者。

下面的示例展示了如何使用 CHGUSRPRF(更改用戶配置文件)將 PGMRGRP2 用戶配置文件未來創(chuàng)建的所有對象的所有者設(shè)置為 PGMR 組配置文件。


清單 7. 更改用戶配置文件將所有者設(shè)置為組配置文件
CHGUSRPRF USRPRF(PGMRGRP2) GRPPRF(QPGMR) OWNER(*GRPPRF)

本文中創(chuàng)建的所有實(shí)例數(shù)據(jù)庫對象均由名為 PGMRGRP2 的用戶配置文件創(chuàng)建。這個用戶配置文件與 QPGMR 組配置文件相關(guān)聯(lián)。因此,QPGMR 組配置文件將作為 PGMRGRP2 創(chuàng)建的全部數(shù)據(jù)庫對象的所有者。

使用系統(tǒng)命名創(chuàng)建架構(gòu)

使用 CREATE SCHEMA 語句,通過系統(tǒng)命名創(chuàng)建一個架構(gòu)時,將應(yīng)用以下規(guī)則:

  • 架構(gòu)的所有者是用戶配置文件還是組配置文件取決于用戶配置文件定義中的 OWNER 選項(xiàng)設(shè)置。
  • 所有者擁有 *ALL 對象權(quán)限,而 *PUBLIC 對象權(quán)限以 QCRTAUT(創(chuàng)建默認(rèn)公共權(quán)限)系統(tǒng)值為依據(jù),其默認(rèn)值是 *CHANGE。

使用 CRTLIB 命令或者 CREATE SCHEMA 語句通過系統(tǒng)命名創(chuàng)建架構(gòu)或庫將得到相同的所有權(quán)和同樣的對象權(quán)限。

PGMRGRP2 用戶配置文件使用以下 SQL 語句、利用系統(tǒng)命名創(chuàng)建了兩個架構(gòu)(PGMRUSR2 和 PGMRXXX2):


清單 8. 架構(gòu)創(chuàng)建示例
CREATE SCHEMA PGMRXXX2; CREATE SCHEMA PGMRUSR2;

兩個架構(gòu)的所有者都是 QPGMR 組配置文件。組配置文件擁有 *ALL 對象權(quán)限,而 *PUBLIC 權(quán)限根據(jù) QCRTAUT 系統(tǒng)值設(shè)置為 *CHANGE。


圖 4. 使用系統(tǒng)命名創(chuàng)建架構(gòu)

可以使用 EDTOBJAUT(編輯對象權(quán)限)或 System i Navigator Permission 界面來顯示、設(shè)置或刪除對象所有者和所指派的對象權(quán)限。使用 System i Navigator 時,可以右鍵單擊一個數(shù)據(jù)庫對象并選擇 Permissions 任務(wù)來訪問該界面。

對象所有權(quán)可以使用 CHGOBJOWN(更改對象所有者)CL 命令進(jìn)行更改。不存在可使用 SQL 更改對象所有者的 SQL 語句或者 System i Navigator 界面。

使用 SQL 命名創(chuàng)建架構(gòu)

使用 SQL 命名創(chuàng)建架構(gòu)時,規(guī)則將更加復(fù)雜:

  • 如果一個用戶配置文件與已有架構(gòu)同名,則架構(gòu)的所有者和在此架構(gòu)中 創(chuàng)建的所有對象的所有者均為該用戶配置文件。例如,一名開發(fā)人員為基于 Web 的新應(yīng)用程序創(chuàng)建了一個名為 WEBERP 的架構(gòu)。如果恰好有一位叫做 Weber Peter 的員工的用戶配置文件也是 WEBERP。那么 WEBERP 用戶配置文件將成為 WEBERP 架構(gòu)的所有者。
  • 如果沒有與架構(gòu)名稱匹配的用戶配置文件名稱,那么架構(gòu)的所有者就是執(zhí)行 CREATE SCHEMA 語句的作業(yè)的用戶配置文件。使用 SQL 命名創(chuàng)建架構(gòu)時,用戶配置文件定義的 OWNER 選項(xiàng)設(shè)置將被忽略。

所有者是惟一對架構(gòu)擁有任意權(quán)限的用戶配置文件。如果其他用戶需要擁有架構(gòu)的對象權(quán)限,那么所有者或具有安全管理權(quán)限 (*SECADM) 或全部對象權(quán)限 (*ALLOBJ) 的用戶配置文件可以使用 GRTOBJAUT(授予對象權(quán)限)CL 命令來授予該架構(gòu)的權(quán)限。

不存在可用于為架構(gòu)授予對象權(quán)限的 SQL 語句。

  • 對于使用 SQL 命名創(chuàng)建的數(shù)據(jù)庫對象,*PUBLIC 對象授權(quán)始終設(shè)置為 *EXCLUDE。QCRTAUT 系統(tǒng)值將被忽略。

為了對比系統(tǒng)與 SQL 命名之間的差異,我們刪除了之前使用系統(tǒng)命名的架構(gòu),并由相同的用戶使用 SQL 命名重新創(chuàng)建它。

在對比兩種模式的所有權(quán)和對象權(quán)限時,我們會發(fā)現(xiàn)以下幾種差異:

  • PGMRXXX2 架構(gòu)的所有者是 PGMRGRP2,也就是架構(gòu)的創(chuàng)建者。PGMRGRP2 用戶配置文件的所有者設(shè)置被忽略。
  • 所 有者 PGMRGRP2 將獲得 *ALL 對象權(quán)限,而 *PUBLIC 對象權(quán)限則設(shè)置為 *EXCLUDE。相比之下,在使用系統(tǒng)命名的架構(gòu)中,*PUBLIC 對象權(quán)限依賴于 QCRTAUT 系統(tǒng)值。因此,同屬 QPGMR 組配置文件的另外一名開發(fā)人員不允許修改架構(gòu)或者在此架構(gòu)內(nèi)創(chuàng)建對象。如果企業(yè)廣泛使用組配置文件,而且任何開發(fā)人員創(chuàng)建的所有對象的所有者都必須成為組 配置文件,那么這種行為會造成一些問題。
  • 架構(gòu) PGMRUSR2 的所有者是 PGMRUSR2,因?yàn)榇嬖谝粋€與此名稱相同的現(xiàn)有用戶配置文件。之前,在使用系統(tǒng)命名創(chuàng)建架構(gòu)時,兩個架構(gòu)的所有者均為 QPGMR 組配置文件。
  • PGMRUSR2 架構(gòu)的所有者 PGMRUSR2 將獲得 *ALL 對象權(quán)限,而 *PUBLIC 權(quán)限設(shè)置為 *EXCLUDE。即便用戶 PGMRGRP2 能夠創(chuàng)建架構(gòu) PGMRUSR2,該用戶也無法獲得該架構(gòu)的任何權(quán)限。PGMRGRP2 無法修改架構(gòu),也無法在此架構(gòu)內(nèi)創(chuàng)建或修改任何對象。

下面的屏幕快照顯示了使用 SQL 命名創(chuàng)建的架構(gòu)的特權(quán)(也稱為權(quán)限)。


圖 5. 使用 SQL 命名創(chuàng)建架構(gòu)

回頁首

表、視圖和索引 – 維護(hù)數(shù)據(jù)的對象

表是在多個列和行中存儲持久用戶數(shù)據(jù)的對象。

視圖和索引是與一個表相關(guān)但不包含任何數(shù)據(jù)的數(shù)據(jù)庫對象。

使用系統(tǒng)命名創(chuàng)建表、視圖和索引。

確定所有權(quán)、應(yīng)用對象權(quán)限的規(guī)則與用于創(chuàng)建架構(gòu)的規(guī)則相匹配。所有者是對象的創(chuàng)建者,或者組配置文件,*PUBLIC 對象權(quán)限設(shè)置為 QCRTAUT 系統(tǒng)值。

在下一個示例中(圖 6. 使用系統(tǒng)命名創(chuàng)建表),表 EMPLOYEE 是在兩種不同的架構(gòu)(PGMRUSR 和 PGMRXXX)中使用系統(tǒng)命名創(chuàng)建的,使用的 SQL 語句如下:


清單 9. 創(chuàng)建 EMPLOYEE 表
Create Table MySchema/Employee (FirstName VarChar(50) Not NULL Default '', Name VarChar(50) Not NULL Default '', Street VarChar(50) Not NULL Default '', ZipCode VarChar(15) Not NULL Default '', City VarChar(50) Not NULL Default '', Country Char(3) Not NULL Default '', Birthday Date Not NULL);

兩種架構(gòu)之前都是由用戶配置文件 PGMRGRP2 使用系統(tǒng)命名,通過 CREATE SCHEMA 語句創(chuàng)建的。兩種架構(gòu)的所有者均為 QPGMR 組配置文件,都基于 PGMRGRP2 用戶配置文件的 OWNER 設(shè)置。組配置文件是 PGMRUSR 架構(gòu)中創(chuàng)建的表的所有者,即便存在 PGRMRUSR 用戶配置文件時也是如此。

所有者用戶配置文件 QPGMR 擁有 *ALL 對象權(quán)限,而 *PUBLIC 權(quán)限則根據(jù) QCRTAUT 系統(tǒng)值設(shè)置為 *CHANGE。

因而,與 QPGMR 組配置文件相關(guān)聯(lián)的所有用戶都允許訪問、修改甚至是刪除 PGMRXXX 和 PGMRUSR 這兩種架構(gòu)中的 EMPLOYEE 表。


圖 6. 使用系統(tǒng)命名創(chuàng)建表

使用 SQL 命名創(chuàng)建表、視圖和索引。

使用 SQL 命名時,會應(yīng)用不同的規(guī)則:

  • 如果某個用戶配置文件的名稱與在其中創(chuàng)建表、視圖或索引的架構(gòu)的名稱相同,那么該用戶配置文件就是表的所有者。
  • 如果不存在與架構(gòu)名稱相同的用戶配置文件,那么所有者將是用戶配置文件或者組配置文件,具體情況取決于用戶配置文件定義中的 OWNER 選項(xiàng)設(shè)置。
  • 使用 SQL 命名創(chuàng)建架構(gòu)以外的數(shù)據(jù)庫對象時,用戶配置文件定義中的 OWNER 選項(xiàng)設(shè)置將被考慮,組配置文件將成為數(shù)據(jù)庫對象的所有者。

圖 7. 使用 SQL 命名在與用戶配置文件不匹配的架構(gòu)中創(chuàng)建表 展示了用戶 PGMRGRP2 在架構(gòu) PGMRXXX2 中創(chuàng)建的 EMPLOYEE 表的權(quán)限結(jié)果。

EMPLOYEE 表的所有者是 QPGMR 組配置文件。所有者 QPGMR 的對象權(quán)限值是 *ALL,而 *PUBLIC 權(quán)限設(shè)置為 *EXCLUDE。因此,與 QPGMR 組配置文件相關(guān)的所有用戶均不允許訪問 EMPLOYEE 表,而且也不允許修改或刪除表。


圖 7. 使用 SQL 命名在與用戶配置文件不匹配的架構(gòu)中創(chuàng)建表

在下一個示例(圖 8. 使用 SQL 命名在匹配用戶配置文件的架構(gòu)中創(chuàng)建表)中,用戶 PGMRGRP2 嘗試在 PGMRUSR2 架構(gòu)中創(chuàng)建 EMPLOYEE 表。

該架構(gòu)之前是由用戶 PGMRGRP2 使用 SQL 命名,通過 CREATE SCHEMA 語句創(chuàng)建的。由于的確有一個名為 PGMRUSR2 的用戶配置文件,因此該用戶配置文件將成為架構(gòu)的所有者,獲得該架構(gòu)的 *ALL 對象權(quán)限,而 *PUBLIC 權(quán)限則設(shè)置為 *EXCLUDE。

CREATE TABLE 語句執(zhí)行將失敗,并提供 24501 SQL 狀態(tài)值,這是因?yàn)?PGMRGRP2 未獲得 PGMRUSR2 架構(gòu)的授權(quán),即便該用戶創(chuàng)建了此架構(gòu)也是如此。(圖 5. 使用 SQL 命名創(chuàng)建架構(gòu) 展示了 PGMRGRP2 不具備 PGMRUSR2 架構(gòu)權(quán)限的情況)。

為了允許 PGMRGRP2 使用 SQL 命名在 PGMRUSR2 架構(gòu)中創(chuàng)建表或任何對象,用戶配置文件或者相關(guān)的 QPGMR 組配置文件必須獲得架構(gòu)的顯式授權(quán),執(zhí)行 GRTOBJAUT 或 EDTOBJAUT 命令均可實(shí)現(xiàn)此目標(biāo)。


圖 8. 使用 SQL 命名在與用戶配置文件匹配的架構(gòu)中創(chuàng)建表

假設(shè) QPGMR 組配置文件已顯式獲得了 PGMRUSR2 架構(gòu)的權(quán)限,那么 PGMRGRP2 用戶就能夠在這個架構(gòu)中創(chuàng)建 EMPLOYEE 表。

由于表是使用 SQL 命名創(chuàng)建的,所以 PGMRUSR2 是一個現(xiàn)有用戶配置文件,因此這個用戶配置文件將再次成為 EMPLOYEE 表的所有者,擁有 *ALL 對象權(quán)限,且 *PUBLIC 對象權(quán)限設(shè)置為 *EXCLUDE,如 圖 9. 架構(gòu)特權(quán) = 用戶配置文件和表 中所示。

在這種情況下,PGMRGRP2 用戶能夠創(chuàng)建表,但不允許使用表。PGMRGRP2 用戶或者 QPGMR 組配置文件必須獲得顯式授權(quán)才能訪問它們之前創(chuàng)建的對象。


圖 9. 架構(gòu)特權(quán) = 用戶配置文件和表

可能出現(xiàn)問題的情況

使用 SQL 命名為現(xiàn)有應(yīng)用程序創(chuàng)建數(shù)據(jù)庫對象可能會在 IBM i 上導(dǎo)致意外問題。

假設(shè)現(xiàn)有原材料管理應(yīng)用程序的所有數(shù)據(jù)庫對象均存儲在一個名為 MAWI 的庫中。這個庫是很久之前使用 CRTLIB 命令創(chuàng)建的。MAWI 庫的所有者是 QPGMR 組配置文件。MAWI 庫的 *PUBLIC 對象權(quán)限是 *CHANGE。

在這個系統(tǒng)中,所有用戶配置文件名稱都結(jié)合了姓氏的前兩個字符和名字的前兩個字符。人力資源部門的一名數(shù)據(jù)錄入員工叫做 Willy Maier,因此他的用戶配置文件是 MAWI。

如果一名開發(fā)人員使用 SQL 命名在 MAWI 庫中創(chuàng)建了一個新表或視圖,那么這個新表的所有者將是 Willy Maier,原因在于他的用戶配置文件與庫名稱匹配。僅有 MAWI 用戶配置文件才具有新表或者視圖的訪問權(quán)限。開發(fā)人員和其他任何用戶都沒有此權(quán)限,因?yàn)?SQL 命名默認(rèn)情況下會強(qiáng)制性將 *PUBLIC 訪問權(quán)限設(shè)置為 *EXCLUDE。

回頁首

SQL 例程

SQL 例程就是可執(zhí)行的 SQL 對象,類似于高級語言 (HLL) 程序。SQL 例程這個術(shù)語用于表示存儲過程、觸發(fā)器或者用戶定義的函數(shù) (UDF)。

這些例程是使用 SQL 或者高級語言(例如 RPG 或 COBOL)編寫的。無論是哪種情況,存儲過程或 UDF 都是使用以下 SQL 語句之一創(chuàng)建的:

  • CREATE PROCEDURE
  • CREATE FUNCTION

SQL 例程的所有權(quán)和對象權(quán)限

對于系統(tǒng)命名和 SQL 命名來說,確定對象所有權(quán)和權(quán)限的規(guī)則均與用戶創(chuàng)建表、視圖或索引的規(guī)則相同。

例程中嵌入的 SQL 語句將根據(jù)創(chuàng)建例程時使用的命名規(guī)范執(zhí)行,即便可能使用不同的命名模式在運(yùn)行時環(huán)境中調(diào)用 SQL 例程。

例如,某個存儲過程是通過使用 SQL 命名的接口來創(chuàng)建的。如果從包含嵌入式 SQL、默認(rèn)使用系統(tǒng)命名的 RPG 程序中調(diào)用該存儲過程,那么 RPG 程序中的嵌入式 SQL 語句會使用系統(tǒng)命名來執(zhí)行,而存儲過程內(nèi)的 SQL 語句會使用 SQL 命名來執(zhí)行。

例程對象的所有權(quán)和訪問權(quán)限僅用于調(diào)用此例程。對象所有權(quán)和權(quán)限值可能會也可能不會應(yīng)用于例程本身執(zhí)行的 SQL 語句。應(yīng)用于例程運(yùn)行的 SQL 請求的權(quán)限 ID(或者用戶配置文件)取決于創(chuàng)建例程時使用的命名規(guī)范,以及例程所執(zhí)行的 SQL 語句是靜態(tài)的還是動態(tài)準(zhǔn)備的

使用系統(tǒng)命名時,DB2 會利用調(diào)用例程的用戶配置文件。使用 SQL 命名執(zhí)行例程內(nèi)的靜態(tài) SQL 語句時,DB2 在默認(rèn)情況下會使用例程的所有者對靜態(tài) SQL 語句執(zhí)行授權(quán)處理。

默認(rèn)情況下,調(diào)用例程的用戶配置文件始終應(yīng)用于例程執(zhí)行的動態(tài) SQL 語句,與使用系統(tǒng)命名還是 SQL 命名無關(guān)。

應(yīng)用于靜態(tài)和動態(tài) SQL 語句的安全性驗(yàn)證和執(zhí)行的用戶配置文件可以在 SET OPTION 語句中手動控制,方法是指定 USRPRF(靜態(tài) SQL 語句的用戶配置文件)和 DYNUSRPRF(動態(tài) SQL 語句的用戶配置文件)選項(xiàng)。

USERPRF 選項(xiàng)可以設(shè)置為以下值之一:

  • *NAMING:*USER 用于系統(tǒng)命名,*OWNER 用于 SQL 命名
  • *OWNER:靜態(tài) SQL 語句使用所有者的權(quán)限執(zhí)行
  • *USER:靜態(tài) SQL 語句使用用戶權(quán)限執(zhí)行

選項(xiàng) DYNUSRPRF 可以設(shè)置為:

  • *USER:系統(tǒng)命名和 SQL 命名的默認(rèn)值。動態(tài) SQL 語句使用用戶權(quán)限執(zhí)行
  • *OWNER:動態(tài) SQL 語句使用所有者權(quán)限執(zhí)行

如果您正在使用 SQL 命名,希望動態(tài) SQL 語句由執(zhí)行靜態(tài) SQL 語句的同一個用戶配置文件執(zhí)行,那么可能需要同時將這兩個選項(xiàng) USRPRF 和 DYNUSRPRF 設(shè)置為 *OWNER 或 *USER。

以下 SQL 語句顯示了使用 SQL 命名創(chuàng)建的一個 SQL 存儲過程的刪減版源代碼。在運(yùn)行時,將根據(jù) SET OPTION 子句中指定的值,由 *OWNER 來執(zhí)行過程中嵌入的所有靜態(tài)和動態(tài) SQL 語句。


清單 10. 創(chuàng)建過程
Create Procedure PGMRUSR2.HSINFO (In Parm1 Integer) Dynamic Result Sets 1 Language SQL Set Option DYNUSRPRF = *OWNER, USRPRF = *NAMING Begin /* Routine code goes here */ End ;

回頁首

觸發(fā)器

觸發(fā)器是特殊類型的 SQL 例程。觸發(fā)器程序鏈接到一個表或者一個 SQL 視圖,并且通過數(shù)據(jù)庫管理器為指定事件(插入、更新或刪除)激活它。

觸發(fā)器程序的所有權(quán)與其他所有 SQL 例程的確定方式相同,但對象和執(zhí)行權(quán)限是由 CREATE TRIGGER 語句單獨(dú)設(shè)置的。

*PUBLIC 對象權(quán)限將設(shè)置為 *EXCLUDE,無論使用的是系統(tǒng)命名還是 SQL 命名。對于使用系統(tǒng)命名創(chuàng)建的其他所有 SQL 對象,*PUBLIC 對象權(quán)限都將設(shè)置為 QCRTAUT 系統(tǒng)值。

下面的示例展示了使用系統(tǒng)命名創(chuàng)建的 SQL 觸發(fā)器的源代碼。


清單 11. 創(chuàng)建觸發(fā)器
CREATE TRIGGER PGMRUSR/TRGEMPLOYEE BEFORE INSERT ON PGMRUSR/EMPLOYEE REFERENCING NEW ROW AS N FOR EACH ROW MODE DB2ROW BEGIN ATOMIC /* Source code goes here */ END;

圖 10 展示了使用系統(tǒng)命名創(chuàng)建的這個觸發(fā)器程序的特權(quán)圖。所有者是 QPGMR 組配置文件,所有者擁有所有對象權(quán)限,而 *PUBLIC 對象權(quán)限設(shè)置為 *EXCLUDE。


圖 10. 使用系統(tǒng)命名創(chuàng)建的觸發(fā)器

如果需要使用 SQL 命名在與某個現(xiàn)有用戶配置文件同名的架構(gòu)中創(chuàng)建觸發(fā)器程序,那么必須顯式為創(chuàng)建者授予表或視圖的權(quán)限,或者為其提供特殊權(quán)限 *ALLOBJ 或 *SECADM。觸發(fā)器程序的所有者是與架構(gòu)同名的用戶,或者創(chuàng)建者用戶配置文件或其相關(guān)的組配置文件,具體取決于創(chuàng)建者的用戶配置文件定義中的 OWNER 選項(xiàng)設(shè)置。

下面的 圖 11. 使用 SQL 命名創(chuàng)建的觸發(fā)器 展示了由用戶 PGMRGRP2 使用 SQL 命名在架構(gòu) PGMRUSR2 中創(chuàng)建的觸發(fā)器程序的特權(quán)圖。由于 PGMRUSR2 也是一個現(xiàn)有用戶配置文件,因此這個用戶配置文件將成為觸發(fā)器程序的所有者。所有者 PGMRUSR2 將獲得 *ALL 對象權(quán)限,而 *PUBLIC 對象權(quán)限則設(shè)置為 *EXCLUDE。


圖 11. 使用 SQL 命名創(chuàng)建的觸發(fā)器

無論創(chuàng)建觸發(fā)器時使用了哪種命名規(guī)范,觸發(fā)器都將使用通過觸發(fā)器程序所有者采用的權(quán)限激活。

回頁首

授予/撤銷權(quán)限

無論數(shù)據(jù)庫對象是使用系統(tǒng)命名還是 SQL 命名創(chuàng)建的,都必須仔細(xì)檢查所有權(quán)和對象權(quán)限。如果默認(rèn)行為不能滿足您的安全性需求,那么可以使用 GRANT 或 REVOKE SQL 語句來調(diào)整設(shè)置。

任何用戶或組配置文件的對象權(quán)限(即便是 *PUBLIC)均可使用 GRANT 語句設(shè)置。如果對象授權(quán)必須移除,則可以使用 REVOKE 語句。可以同時使用 GRANT 和 REVOKE 語句來處理所有可訪問或執(zhí)行的數(shù)據(jù)庫對象(架構(gòu)和觸發(fā)器除外)。

此外還可以使用 GRTOBJAUT(授予對象權(quán)限)和 EDTOBJAUT(編輯對象權(quán)限)CL 命令來修改數(shù)據(jù)庫對象的對象權(quán)限。不過,使用 CL 命令和 SQL 語句提供權(quán)限時略有差異。

回頁首

設(shè)置會話權(quán)限

在使用 SQL 命名時,SET SESSION AUTHORIZATION 和 SET SESSION USER 語句可能會影響對象所有權(quán)和權(quán)限。

在建立一個連接之后,可以使用 SET SESSION AUTHORIZATION 或 SET SESSION 語句,將用戶配置文件切換到另外一個用戶配置文件(權(quán)限 ID),并采用該用戶配置文件的訪問權(quán)限。您已經(jīng)學(xué)習(xí)了在使用 SQL 命名創(chuàng)建對象時如何將用戶配置文件值應(yīng)用于對象所有權(quán)和授權(quán)。

回頁首

結(jié)束語

至此,您應(yīng)該已經(jīng)很好地了解了為何使用系統(tǒng)命名和 SQL 命名創(chuàng)建的 DB2 對象的所有權(quán)和訪問權(quán)限指派方式有所不同。

由于存在這些不同的行為,因此您應(yīng)該為使用 SQL 創(chuàng)建的所有數(shù)據(jù)庫對象(或者至少是一個架構(gòu)中的所有數(shù)據(jù)庫對象)確定一種命名規(guī)范方法。

  • 如果您的目的是設(shè)計(jì)一個能夠在不同數(shù)據(jù)庫系統(tǒng)上運(yùn)行的應(yīng)用程序,那么 SQL 命名是實(shí)現(xiàn)最大限度的可遷移性的正確方法。
  • 如果您僅使用 DB2 for i,而且必須維護(hù)較為陳舊的應(yīng)用程序與多種基于 DDS 的對象和 SQL 數(shù)據(jù)庫對象,還要使用 IBM i 特有的對象權(quán)限(例如組配置文件),那么系統(tǒng)命名將是您更好的選擇。

現(xiàn)在,祝您使用系統(tǒng)命名或 SQL 命名規(guī)劃、設(shè)計(jì)、創(chuàng)建和維護(hù)數(shù)據(jù)庫對象時一帆風(fēng)順。

總結(jié)

以上是生活随笔為你收集整理的系统命名与 SQL 命名之争 - 第 1 部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。