SELECT A.SID,A.SERIAL#,A.USERNAME,B.TYPE FROM V$SESSION A,V$LOCK B WHERE A.SID=B.SID order by sid;
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
搜尋此網誌
2014年7月8日 星期二
2014年6月11日 星期三
Oracle中dual表的用途
dual是一個虛擬表,用來構成select的語法規則,oracle保證dual裡面永遠只有一條記錄。我們可以用它來做很多事情,如下:
1、查看當前使用者,可以在 SQL Plus中執行下面語句 select user from dual;
2、用來調用系統函數
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;--獲得當前系統時間
select SYS_CONTEXT('USERENV','TERMINAL') from dual;--獲得主機名稱
select SYS_CONTEXT('USERENV','language') from dual;--獲得當前 locale
select dbms_random.random from dual;--獲得一個亂數
3、得到序列的下一個值或當前值,用下面語句
select your_sequence.nextval from dual;--獲得序列your_sequence的下一個值
select your_sequence.currval from dual;--獲得序列your_sequence的當前值
4、可以用做計算機 select 7*9 from dual;
------
Oracle系統中dual表是一個「神秘」的表,網上有很多網友都對該表進行了測試,該表只有一行一列,其實該表和系統中的其他表一樣,一樣可以執行插入、更新、刪除操作,還可以執行drop操作。但是不要去執行drop表的操作,否則會使系統不能用,資料庫起不了,會報Database startup crashes with ORA-1092錯誤。此時也不要慌亂,可以通過執行以下步驟來進行恢復。可以用sys使用者登陸。
SQL> create pfile=’d:pfile.bak’ from spfile
SQL> shutdown immediate
在d:pfile.bak檔中最後加入一條:
replication_dependency_tracking = FALSE
重新開機資料庫:
SQL> startup pfile=’d:pfile.bak’
SQL> create table 「sys」.」DUAL」
[an error occurred while processing this directive]
=====
DUAL ? 有什麼神秘的? 當你想得到ORACLE系統時間, 簡簡單單敲一行SQL 不就得了嗎? 故弄玄虛....
SQL> select sysdate from dual;
SYSDATE
---------
28-SEP-03
哈哈, 確實DUAL的使用很方便. 但是大家知道DUAL倒底是什麼OBJECT, 它有什麼特殊的行為嗎? 來,我們一起看一看. 首先搞清楚DUAL是什麼OBJECT :
SQL> connect system/manager
Connected.
SQL> select owner, object_name , object_type from dba_objects where object_name like '%DUAL%'; OWNER OBJECT_NAME OBJECT_TYPE
--------------- --------------- -------------
SYS DUAL TABLE PUBLIC DUAL SYNONYM
原來DUAL是屬於SYS schema的一個表,然後以PUBLIC SYNONYM的方式供其他資料庫USER使用.
再看看它的結構:
SQL> desc dual Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
SQL>
只有一個名字叫DUMMY的字元型COLUMN .
然後查詢一下表裡的資料:
SQL> select dummy from dual;
DUMMY
----------
X
哦, 只有一條記錄, DUMMY的值是’X’ .很正常啊,沒什麼奇怪嘛. 好,下面就有奇妙的東西出現了!
插入一條記錄:
SQL> connect sys as sysdba
Connected.
SQL> insert into dual values ( 'Y');
1 row created.
SQL> commit;
Commit complete.
SQL> select count(*) from dual;
COUNT(*)
----------
2
迄今為止,一切正常. 然而當我們重新查詢記錄時,奇怪的事情發生了
SQL> select * from dual;
DUMMY
----------
X
剛才插入的那條記錄並沒有顯示出來 ! 明明DUAL表中有兩條記錄, 可就是只顯示一條!
再試一下刪除 ,狠一點,全刪光 !
SQL> delete from dual; /*注意沒有限定條件,試圖刪除全部記錄*/
1 row deleted.
SQL> commit;
Commit complete.
哈哈,也只有一條記錄被刪掉,
SQL> select * from dual;
DUMMY
----------
Y
為什麼會這樣呢? 難道SQL的語法對DUAL不起作用嗎?帶著這個疑問,
我查詢了一些ORACLE官方的資料. 原來ORACLE對DUAL表的操作做了一些內部處理,儘量保證DUAL表中只返回一條記錄.當然這寫內部操作是不可見的 . 看來ORACLE真是蘊藏著無窮的奧妙啊!
1、查看當前使用者,可以在 SQL Plus中執行下面語句 select user from dual;
2、用來調用系統函數
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;--獲得當前系統時間
select SYS_CONTEXT('USERENV','TERMINAL') from dual;--獲得主機名稱
select SYS_CONTEXT('USERENV','language') from dual;--獲得當前 locale
select dbms_random.random from dual;--獲得一個亂數
3、得到序列的下一個值或當前值,用下面語句
select your_sequence.nextval from dual;--獲得序列your_sequence的下一個值
select your_sequence.currval from dual;--獲得序列your_sequence的當前值
4、可以用做計算機 select 7*9 from dual;
------
Oracle系統中dual表是一個「神秘」的表,網上有很多網友都對該表進行了測試,該表只有一行一列,其實該表和系統中的其他表一樣,一樣可以執行插入、更新、刪除操作,還可以執行drop操作。但是不要去執行drop表的操作,否則會使系統不能用,資料庫起不了,會報Database startup crashes with ORA-1092錯誤。此時也不要慌亂,可以通過執行以下步驟來進行恢復。可以用sys使用者登陸。
SQL> create pfile=’d:pfile.bak’ from spfile
SQL> shutdown immediate
在d:pfile.bak檔中最後加入一條:
replication_dependency_tracking = FALSE
重新開機資料庫:
SQL> startup pfile=’d:pfile.bak’
SQL> create table 「sys」.」DUAL」
[an error occurred while processing this directive]
=====
DUAL ? 有什麼神秘的? 當你想得到ORACLE系統時間, 簡簡單單敲一行SQL 不就得了嗎? 故弄玄虛....
SQL> select sysdate from dual;
SYSDATE
---------
28-SEP-03
哈哈, 確實DUAL的使用很方便. 但是大家知道DUAL倒底是什麼OBJECT, 它有什麼特殊的行為嗎? 來,我們一起看一看. 首先搞清楚DUAL是什麼OBJECT :
SQL> connect system/manager
Connected.
SQL> select owner, object_name , object_type from dba_objects where object_name like '%DUAL%'; OWNER OBJECT_NAME OBJECT_TYPE
--------------- --------------- -------------
SYS DUAL TABLE PUBLIC DUAL SYNONYM
原來DUAL是屬於SYS schema的一個表,然後以PUBLIC SYNONYM的方式供其他資料庫USER使用.
再看看它的結構:
SQL> desc dual Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
SQL>
只有一個名字叫DUMMY的字元型COLUMN .
然後查詢一下表裡的資料:
SQL> select dummy from dual;
DUMMY
----------
X
哦, 只有一條記錄, DUMMY的值是’X’ .很正常啊,沒什麼奇怪嘛. 好,下面就有奇妙的東西出現了!
插入一條記錄:
SQL> connect sys as sysdba
Connected.
SQL> insert into dual values ( 'Y');
1 row created.
SQL> commit;
Commit complete.
SQL> select count(*) from dual;
COUNT(*)
----------
2
迄今為止,一切正常. 然而當我們重新查詢記錄時,奇怪的事情發生了
SQL> select * from dual;
DUMMY
----------
X
剛才插入的那條記錄並沒有顯示出來 ! 明明DUAL表中有兩條記錄, 可就是只顯示一條!
再試一下刪除 ,狠一點,全刪光 !
SQL> delete from dual; /*注意沒有限定條件,試圖刪除全部記錄*/
1 row deleted.
SQL> commit;
Commit complete.
哈哈,也只有一條記錄被刪掉,
SQL> select * from dual;
DUMMY
----------
Y
為什麼會這樣呢? 難道SQL的語法對DUAL不起作用嗎?帶著這個疑問,
我查詢了一些ORACLE官方的資料. 原來ORACLE對DUAL表的操作做了一些內部處理,儘量保證DUAL表中只返回一條記錄.當然這寫內部操作是不可見的 . 看來ORACLE真是蘊藏著無窮的奧妙啊!
2014年4月14日 星期一
如何從 Server-side 指定 IE8 瀏覽器應使用的瀏覽器模式
IE8 就快要正式推出了,在這個時刻,身為網頁開發者的你是否已經準備應戰了呢?IE 相容性問題一直以來都是網頁開發人員的痛,光是 IE6 + IE7 就不知道讓多少人痛苦萬分。不過還好,到了 IE8 至少還有個機會喘息一下。如果來不及準備,那就要好好看看這篇文章,至少不會讓你的網站那麼快陣亡。
雖然 IE8 提供「相容性檢視」功能 (如下圖),可以讓你以 IE7 預設的文件模式顯示網頁,不過在預設的情況下,IE8 還是會選擇「Internet Explorer 8 標準模式」進行網頁的顯示,由於還是有不少地方與 IE7 不相容,所以你的網頁還是有可能會亂掉。
除了由使用者自行設定之外,事實上,IE8 還提供了另一種解決方案,讓網站管理員可以透過設定 HTTP Header 或 HTML META Tag 的方式,讓 IE8 自動選擇「相容性檢視」進行顯示網頁,如此一來你就不用害怕你的網站在 IE8 會亂掉的問題了。
第一種宣告方式:設定整個網站都以 IE7 相容模式顯示網頁 ( HTTP HEADER )
若以設定 IIS6 為例,你可以在 網際網路資訊服務 (IIS) 管理員 中,在站台中新增一個自訂的 HTTP 標頭名為 X-UA-Compatible,並且將值設定為 IE=EmulateIE7 即可完成全站設定。
如果是 IIS7 那就更簡單了,除了透過圖形化介面修改外,也可以直接修改網站根目錄下的 web.config 檔,並在 <httpProtocol> 區段內加入以下這行即可:
<httpProtocol> <customHeaders> <clear /> <add name="X-UA-Compatible" value="IE=EmulateIE7" /> </customHeaders> </httpProtocol>
至於 Apache Web Server 來講,你只要啟用 mod_headers 模組後,加底下這行到你的 VirtualHost 設定即可:
Header add X-UA-Compatible IE=EmulateIE7
只要這樣設定後,你的網站在 IE8 中檢視時,就會預設以模擬 IE7 文件模式的顯示方式運作了。
第二種宣告方式:設定特定網頁以 IE7 相容模式顯示網頁 ( META TAG )
這方式可以套用在「特定頁面」中,是以「頁面」為基礎的調整,你只要在 <head> 與 </head> 之間加入以下這行 Meta Tag 即可套用完成:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
但有一點必須特別注意,這一行 Meta Tag 的宣告必須出現在 <head> ... </head> 之中,而且 <head> 一定要出現在 <body> 之前,才會正確套用 IE8 的「相容性檢視」功能,例如:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> </head> <body> <h1>TEST</h1> </body> </html>
---
以上二種宣告方式是以「頁面」為基礎的宣告方式優先權較高,所以比較安全的設定法,通常是設定 HTTP Header 為 IE=EmulateIE7,若頁面中有支援 IE8 的頁面,才設定成 <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" /> 讓 IE8 顯示該網頁時得以用 Internet Explorer 8 標準模式進行網頁顯示。
2014年4月6日 星期日
SQL去除欄位前後空白及斷行字元
SQL 中的 TRIM 函數是用來移除掉一個字串中的字頭或字尾。最常見的用途是移除字首或字尾的空白。這個函數在不同的資料庫中有不同的名稱:
MySQL: TRIM(), RTRIM(), LTRIM()
Oracle: RTRIM(), LTRIM()
SQL Server: RTRIM(), LTRIM()
SQL Server及Oracle沒有TRIM()函數,因此可用下列的語法清除:
-- SQL去除斷行字元 (1st)
UPDATE [Donor]
SET [DonorList] = REPLACE(([DonorList]), CHAR(10), '');
-- SQL去除前後空白 (2rd)
UPDATE [Donor]
SET [DonorList] = LTRIM(RTRIM([DonorList]));
而UI裏該欄位也要在異動資料時,自動去除斷行及空白字元。
// C#去除斷行及空白字元
this.ctrlDonorList.Text = this.ctrlDonorList.Text.Trim('\r', '\n', ' ');
如此內服外敷,即可藥到病除。
MySQL: TRIM(), RTRIM(), LTRIM()
Oracle: RTRIM(), LTRIM()
SQL Server: RTRIM(), LTRIM()
SQL Server及Oracle沒有TRIM()函數,因此可用下列的語法清除:
-- SQL去除斷行字元 (1st)
UPDATE [Donor]
SET [DonorList] = REPLACE(([DonorList]), CHAR(10), '');
-- SQL去除前後空白 (2rd)
UPDATE [Donor]
SET [DonorList] = LTRIM(RTRIM([DonorList]));
而UI裏該欄位也要在異動資料時,自動去除斷行及空白字元。
// C#去除斷行及空白字元
this.ctrlDonorList.Text = this.ctrlDonorList.Text.Trim('\r', '\n', ' ');
如此內服外敷,即可藥到病除。
2014年3月3日 星期一
還原被限制無法存取的DB
ALTER DATABASE CNTMGM SET OFFLINE WITH ROLLBACK IMMEDIATE
RESTORE DATABASE CNTMGM FROM DISK='D:\CNTMGM2014三月3.BAK' WITH RESTRICTED_USER,REPLACE
RESTORE DATABASE CNTMGM FROM DISK='D:\CNTMGM2014三月3.BAK' WITH RESTRICTED_USER,REPLACE
2014年2月9日 星期日
密碼都對了,可是就是登不進去!!?? 可能是變成非multiple囉
怎麼還原資料庫(Restore)後,資料庫的名稱旁多了一個「限制的使用者」呢?該怎麼更改設定?
不要以為這是惡作劇,這不是把資料庫的名稱多加了這一串字,沒那麼無聊
在資料庫的屬性的「選項」中,可以來修改資料庫的限制存取方式
下圖中可以看到總共有三種模式:「Multiple」、「Single」與「Restricted」
- Single User Mode :同一時間只能任一個使用者登入使用
- Restricted User Mode : 只有db_owner、dbcreator、sysadmin 群組的人可以登入
- Multiple User Mode:有權限的都能依權限範圍使用
ALTER DATABASE [DB_Name] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [DB_Name] SET SINGLE_USER WITH NO_WAIT
或者
EXEC sp_dboption 'DB_Name', 'single user', 'false'
EXEC sp_dboption 'DB_Name', 'single user', 'true'
底下就改成了「單一使用者」了還原資料庫時,"無法獲得獨佔存取權,因為資料庫正在使用中"的解決方法
使用Sql Server Management Studio 還原資料庫時,
常會遇到 "無法獲得獨佔存取權,因為資料庫正在使用中" 的錯誤訊息
我的一勞永逸解決方法
用指令還原
指令如下
常會遇到 "無法獲得獨佔存取權,因為資料庫正在使用中" 的錯誤訊息
我的一勞永逸解決方法
用指令還原
指令如下
ALTER DATABASE 你的DB名稱 SET OFFLINE WITH ROLLBACK IMMEDIATE絕對有效
RESTORE DATABASE 你的DB名稱 FROM DISK='C:\你的路徑\你的備份檔點BAK' WITH RESTRICTED_USER,REPLACE
訂閱:
文章 (Atom)