2017年12月22日 星期五

[MS SQL]停用/啟用 Foreign Key

-- Disable all table constraints

ALTER TABLE [table_name] NOCHECK CONSTRAINT ALL

-- Enable all table constraints

ALTER TABLE [table_name] WITH CHECK CHECK CONSTRAINT ALL

-- Disable single constraint

ALTER TABLE [table_name] NOCHECK CONSTRAINT [fk_name]

-- Enable single constraint

ALTER TABLE [table_name] WITH CHECK CHECK CONSTRAINT [fk_name]

https://stackoverflow.com/questions/159038/how-can-foreign-key-constraints-be-temporarily-disabled-using-t-sql

2017年11月22日 星期三

[MS SQL] loop

DECLARE @cnt INT = 0;

WHILE @cnt < cnt_total
BEGIN
   {...statements...}
   SET @cnt = @cnt + 1;
END;

2017年11月1日 星期三

[MS SQL]Patition

https://dotblogs.com.tw/jamesfu/archive/2012/12/25/partitiontable.aspx?fid=77758
https://dotblogs.com.tw/ricochen/2012/05/04/71971
https://docs.microsoft.com/zh-tw/sql/t-sql/statements/create-partition-scheme-transact-sql


-- 依據 Partition Function 建立 Partition Schema
create partition scheme psPartitionTest
as partition pfPartitionTest
ALL TO ([ PRIMARY ] );

--create partition function
CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES (1, 100, 1000);  
GO  
--create partition scheme
CREATE PARTITION SCHEME myRangePS1  
AS PARTITION myRangePF1  
ALL TO ( [PRIMARY] );  
--檢查是否建立成功
select * from sys.partition_functions;
select * from sys.partition_schemes;

-- 建立 Table 一開始就使用 Partition Schema
CREATE TABLE [apuser].[A](
    [MOUDLE] [nvarchar](4) NOT NULL,
    [SEQ] int NOT NULL,
[CONTENT] [nvarchar](100),
 CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED 
(
    [MOUDLE] ASC,
    [SEQ] ASC
)
) ON myRangePS1(SEQ);

--insert 測試資料
insert into [apuser].A(MOUDLE,SEQ,CONTENT)
values('RB',1,'testtest');
insert into [apuser].A(MOUDLE,SEQ,CONTENT)
values('RB',100,'testtest');
insert into [apuser].A(MOUDLE,SEQ,CONTENT)
values('RB',101,'testtest');
insert into [apuser].A(MOUDLE,SEQ,CONTENT)
values('RB',999,'testtest');
insert into [apuser].A(MOUDLE,SEQ,CONTENT)
values('RB',999999,'testtest');

--檢查是否建於正確的partition
SELECT t.name,p.object_id,p.partition_id,p.rows 
FROM sys.partitions AS p
JOIN sys.tables AS t
ON  p.object_id = t.object_id
WHERE p.partition_id IS NOT NULL
AND t.name = 'A';

--取得某一資料的資料分割編號
SELECT $PARTITION.myRangePF1 (988) ;
--取得每個資料分割筆數(is not null)
SELECT $PARTITION.myRangePF1(SEQ) AS Partition, 
COUNT(*) AS [COUNT] FROM A 
GROUP BY $PARTITION.myRangePF1(SEQ)
ORDER BY Partition ;

--取得 partition table 分割界限值
SELECT t.name AS TableName, i.name AS IndexName,r.value AS BoundaryValue , p.partition_number, 
p.partition_id, i.data_space_id, f.function_id, f.type_desc, r.boundary_id
FROM sys.tables AS t
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.partitions AS p
    ON i.object_id = p.object_id AND i.index_id = p.index_id 
JOIN  sys.partition_schemes AS s 
    ON i.data_space_id = s.data_space_id
JOIN sys.partition_functions AS f 
    ON s.function_id = f.function_id
LEFT JOIN sys.partition_range_values AS r 
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number
WHERE t.name = 'A' AND i.type <= 1
ORDER BY p.partition_number;

--取得 partition column
SELECT t.object_id AS Object_ID, t.name AS TableName, ic.column_id as PartitioningColumnID, 
c.name AS PartitioningColumnName 
FROM sys.tables AS t
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.columns AS c
    ON t.object_id = c.object_id
JOIN sys.partition_schemes AS ps
    ON ps.data_space_id = i.data_space_id
JOIN sys.index_columns AS ic
ON ic.object_id = i.object_id AND ic.index_id = i.index_id AND ic.partition_ordinal > 0 
WHERE t.name = 'A'
AND i.type <= 1
AND c.column_id = 1;

--傳回資料分割=2 相關資料
SELECT * FROM A
WHERE $PARTITION.myRangePF1(SEQ) = 2 ;

--取得所有 partition table的 partition function 、scheme和column name
SELECT OBJECT_NAME(p.OBJECT_ID) TableName,    
c.name PartColumn,      
ps.name PartScheme,    
pf.name PartFunction 
FROM sys.data_spaces  d JOIN      
sys.indexes i JOIN   
(SELECT DISTINCT OBJECT_ID     
FROM sys.partitions       
WHERE partition_number > 1) p    
ON i.OBJECT_ID = p.OBJECT_ID      
ON d.data_space_id = i.data_space_id     
JOIN sys.partition_schemes ps ON d.data_space_id = ps.data_space_id    
JOIN sys.partition_functions pf ON ps.function_id = pf.function_id      
JOIN sys.index_columns ic ON i.index_id = ic.index_id AND i.OBJECT_ID = ic.OBJECT_ID  
JOIN sys.columns c ON c.OBJECT_ID = ic.OBJECT_ID AND c.column_id = ic.column_id;

2017年10月20日 星期五

[SQL Server]update join table

https://stackoverflow.com/questions/1293330/how-can-i-do-an-update-statement-with-join-in-sql

SQL Server:
update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid
Oracle:
update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

2017年9月30日 星期六

SVN小烏龜圖示消失


參考來源:http://hsieheric.blogspot.tw/2014/12/tortoisesvn-tortoisegit-icon.html


1.使用執行輸入regedit

2.路徑
HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > Windows >CurrentVersion >Explorer > ShellIconOverlayIdentifiers

3.修改名稱改變順序

4.重啟資料夾

2017年2月14日 星期二

TABLE LOCK KILL

1.先查出要砍掉的session
select b.object_name obj_name,
       d.ctime time,
       to_char(d.lmode) l,
       to_char(d.request) r,
       a.os_user_name os_user,
       c.machine machine,
       c.program program,
       c.serial# s_serial,
       a.oracle_username ora_user,
       a.object_id obj_id,
       a.process pid,
       a.session_id s_id,
       p.spid
from v$locked_object a, all_objects b, v$session c, v$lock d,V$process p
where a.object_id=b.object_id
and c.Paddr = p.Addr
and a.session_id=c.sid
and a.session_id=d.sid
--and d.type='TX'
order by d.ctime desc, p.spid;

2.unix 砍掉該spid session
ps -ef
kill -9

2017年2月13日 星期一

[oracle]REBUILD INDEX



alter index INDEX_NAME rebuild;

dbms_stats.gather_table_stats('OWNER','TABLE_NAME',degree => 4,cascade => true);

定期更新表格的統計資料(statistics)對於Oracle成本優化器(CBO)產生的存取方式優劣有著舉足輕重的地位.
SQL> exec dbms_stats.gather_schema_stats(‘owner’);
or
SQL> exec dbms_stats.gather_table_stats(‘owner’,’table_name’);

索引(index)是另一個影響Oracle資料庫效能的關鍵因素.使用者根據SQL之選擇條件(where condition)建立適當的索引,加速表格(table)資料的存取速度.過多與不適的索引,不但對於資料的存取沒有幫助,甚至會增加更新類交易之負擔.在Oracle9i以後的版本,使用alter index monitoring usage來監控表格索引的使用,使用者根據v$object_usage視觀(view)中uesd欄位值(Yes or No),判斷與刪除冗贅不必要的索引.
SQL> ALTER INDEX index_name MONITORING USAGE;

針對異動頻繁的表格,常常在系統運作一段時間後,發現資料的存取速度突然變慢很多,發生這種現象普遍的原因為索引區塊(index blocks)中產生過多的刪除記錄(entries)所致.Oracle中analyze index validate structure指令就是用來判讀索引的使用狀況,透過index_stats視觀中leaf rows的刪除比率(del_lf_rows / lf_rows * 100 > 15%)決定是否需要重建(rebuild)索引,讓管理人員提早發現問題,預防效能不佳的情形發生.
SQL> ANALYZE INDEX index_name VALIDATE STRUCTURE。

--partition table index rebuild
Step 1:  Look-up the partition name in dba_ind_partitions.
select * from dba_ind_partitions where index_name = 'XXX'
Step 2:  specify the partition name in the index rebuild statement:
SQL> alter index idx_hist_i3 rebuild partition p3;

Index altered.

select 'alter index '||index_name||' rebuild partition '||partition_name||';' from dba_ind_partitions where index_name = 'XXX';

2017年2月9日 星期四

[轉]UE 15個小技巧

1. UEDIT查找的快捷鍵是Ctrl+F(find)或ALT-F3,替換的快捷鍵是Ctrl+R(replace),再次查找的快捷鍵是F3。

2. 一般尋找與取代功能:

※在尋找/取代內將「正規化」的√給去除,並分別在尋找/取代的框格內輸入所需的文字,執行尋找/取代即可。
※如果需要尋找Enter鍵,在尋找框中可輸入^p(注意p是小寫)來代替Enter鍵。

Symbol
Function
^^
尋找 ^ 符號
^s
巨集執行時尋找選擇的字串(反白的字串)
^c
巨集執行時尋找剪貼簿的內容
^b
尋找分頁點
^p
尋找換行(dos/windows模式)
^r
尋找換行(MAC模式)
^n
尋找換行(unix模式)
^t
尋找tab

選擇所有內文之間的游標位置和搜尋目標,按住Shift鍵,在當時的搜尋是開始尋找下一個按鈕。


3. 沒有註冊碼,如何有效使用Ultraedit呢?
很多人立即想到使用crack版,可實際追究起來,那是違法的事情。
實際上,Ultraedit並沒有把路子完全堵死。我們可以使用一些小技巧來躲掉這個問題。
修改ultraedit的快捷方式,將命令行改為:E:\uedit9\UEDIT32.EXE p:,
其中p:必須是你的機器上不存在的磁碟分割,這樣,就不會有試用時間結束的問題了。

4. 如何去掉所編輯文本中包含特定字串的行? 
這則技巧是在UltraEdit的幫助文件裡提到.CTRL+R 叫出取代(Replace)視窗,
選取"正規化";然後用尋找 %*你的字串*^p 替換成空內容即可.
(UltraEdit的正規化引擎,進階->搜尋->正規化引擎->UltraEdit樣式)
如,我現在有個文件,需要去掉所有包含 http://www.baidu.net/ 這個字串的行,
尋找 %*http://www.baidu.net/*^p 替換成空即可.
注意,^p 是 DOS 文件類型的換行.如果是 Unix 類型文件,則用 ^n.

5. 如何在行末加入特定字元,比如逗號?
有了上面的經驗,CTRL+R 叫出取代(Replace)視窗,
選取"正規化";然後可以尋找 ^p(或者^n,如果是Unix 文件),
用 ,^p(或者,^n)進行"全部取代"即可.補充一點,如果是 MAC(Apple) 類型文件,則換行符號為 ^r .

6. 如何刪除空行?
參考上面兩個例子,查找 ^p$ 然後替換為空即可.

7. 編輯文件如何加入時間戳 ?
F7 快捷鍵即可.你試試看?


8. 為何 複製(Copy)/貼上(Paste)功能不能用了?
UltraEdit有10個剪貼簿(clipboard),分別用Ctrl+0 - Ctrl+9 切換
Ctrl+0 是Windows 的,其他則為用戶自定義的.我在使用的過程中錯調用了 CTRL+n,
結果內容就有問題了.你遇到過沒?

9. 即使是打開小文件也有遲延?
每次打開文件的時候總有幾秒鐘的耽擱.我的電腦效能可不算差.怎麼回事?
網絡印表機搞得鬼!
打開"進階"->"組態"->"編輯器"->"進階",
看看是不是選中了"讀取/還原印表機設定"?
如果是的話,去掉.

10. 刪除當前行內容 CTRL+e

11. 你按一下快捷鍵ALT+c試試,變為列編輯模式,可以一次輸入多行內容,只要你選好行範圍,編輯整齊的表格非常方便。

12. 游標位於某一行,按Ctrl+F2試試,有了標籤了,多設幾個,按住F2,它會往你設定的標籤處跳來跳去,很好玩(Alt+F2回前一個標籤)。

13. 發現沒有,有時候很多文件類型在Ultraedit裡沒有語法高亮度顯示,很麻煩不是。
不要急,從UE的網站上下一些方法的模組,找到你要的文件類型的語法文件,
將其內容追加到wordfile.txt裡頭,注意序號不要重複,一定要在1-20之間。網址是:
http://www.ultraedit.com/index.php?name ... age&pid=40

14.ctrl+b
寫程式的時候,括號一般要一一對應的,但是如果嵌套太多,看花眼了,怎麼辦?
你把游標放在括號開始的地方,按ctrl+b,UE 會幫你找到相對應的括號結尾的地方。
你還可以試試連著多按幾次ctrl+b。

15.自定義快捷鍵
UE很多功能都有快捷鍵,但不是所有的都有。
UE 11.00有一個Text2html的功能。我工作中遇到了要對大量源始碼進行這種操作的情況。
我就想自己定一個快捷鍵。advanced(進階)/configuration(組態)/key mapping(快速鍵)
在commands(指令)裡面找到你要用的command.
我這裡是HTMLConvertSpecialChars(HTML-轉換特殊字符),然後點 Press new key(新鍵)下面的輸入框,
設置一個自己覺得爽,不衝突的快捷鍵。比如ctrl+alt+s.然後點ok.這樣用常用的功能,可以成倍提高效率。

2017年2月7日 星期二

[oracle] JOB排程 DBMS_JOB

/*
--在oracle中設定排程執行procedure
--參數說明--參數1:為out參數,可由此jobno查詢狀態(註1)/參數2:要執行的procedure名稱/參數3:下次要執行的時間/參數4:要執行的間隔(只要執行一次傳NULL即可)
/*
下面是常有的設置Interval的方法:
    每天固定時間運行,比如早上8:10分鐘:Trunc(Sysdate+1) + 8/24

    每天:trunc(sysdate+1)
    每週:trunc(sysdate+7)
    每月:trunc(sysdate+30)
    每個星期日:next_day(trunc(sysdate),'SUNDAY')  
    每天6點:trunc(sysdate+1)+6/24    
    每半個小時:sysdate+30/1440
*/
/*
DBMS_JOB.SUBMIT(
   job       OUT    BINARY_INTEGER,
   what      IN     VARCHAR2, NEXT_DATE IN DATE DEFAULTSYSDATE,
   interval  IN     VARCHAR2 DEFAULT 'NULL',
   no_parse  IN     BOOLEAN DEFAULT FALSE,
   instance  IN     BINARY_INTEGER DEFAULT ANY_INSTANCE,
   force     IN     BOOLEAN DEFAULT FALSE);
*/
/*
查看執行狀況
select * from user_jobs;
broken=y為任務停止, n為任務啟動成功
*/
--建立程序
declare
  jobno    number;
begin
  dbms_job.submit(jobno, 'sp_ins_stk05_0809;',  sysdate, '');
  dbms_output.put_line(jobno);
  commit;
end;
/
declare
  jobno    number;
begin
  dbms_job.submit(jobno, 'SP_NA_DAILY_STORE_STINE_TRP031(''20161021'',''20161031'');',  sysdate + 660/1440, '');
  dbms_output.put_line(jobno);
  commit;
end;
/
--每天固定時間啟動範例
declare
  jobno    number;
begin
  dbms_job.submit(jobno, 'Gt_Invoice_f_bk(''20161231'');',  sysdate, 'trunc(sysdate+1)+6/24');
  dbms_output.put_line(jobno);
  commit;
end;
/
--移除程序

begin
dbms_job.remove(141);
end;
/

--暫停程序
begin
  dbms_job.broken([jobs: 程序#], [broken: true/false], [next_date: 下次一執行日期時間]);
end;
/
--next_date未指定時, 預設為目前的日期時間

--恢復程序
begin
  dbms_job.broken(158, false, sysdate);
end;
/
*/