2013/12/27

結構描述 ' ',資料庫 ' ',物件 ' ' 沒有 EXECUTE 權限。

我在作完資料庫移機的事情之後
執行網站 看到了這樣的錯誤:
結構描述 'xxx1 ',資料庫 'xxx2 ',物件 'xxx3 ' 沒有 EXECUTE 權限。
在網路上查了一下發現一篇解決方法:


http://hi.baidu.com/jinzesudawei/item/e1c18c262b2b168e9d63d1c6
連結內容摘要:
1. 在資料庫xxx2 身上按右鍵「屬性」
2. 在左邊選單按一下「權限」
3. 在你想要給予權限的登入帳號增加「執行」的權限


我照作,問題解決了,但我覺得這很奇怪
因為在舊資料庫的設定並沒有給予「執行」的權限

=== 正解在此

經過大師指點,在舊資料庫的設定是更細節的設定
可以只授權給某個資料表、預存程序、函數等

設定方法:
1. 打開資料庫xxx2 點開安全性
2. 在你想要給予權限的登入帳號身上按右鍵「屬性」
3. 左邊選單按一下「安全性實體」
4. 右邊按一下「搜尋」
5. 您要加入什麼物件?選下列類型的所有物件
6. 假設要開放權限的是預存程序,請選預存程序
7. 在上方列表會看到所有預存程序 可以在這設定執行權限

===

題外話,資料庫有一個設定是啟用 CLR 整合


http://msdn.microsoft.com/zh-tw/library/ms254506%28v=vs.80%29.aspx
連結內容摘要:
執行以下SQL
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO


可以用
select [value_in_use] from sys.configurations where name = 'clr enabled'
來檢查目前資料庫的設定值


參考微軟的說明
連結內容摘要:
CLR 整合意味著您現在可以使用任何 .NET Framework 語言 (包括 Microsoft Visual Basic .NET 和 Microsoft Visual C#) 撰寫預存程序、觸發程序、使用者定義型別、使用者定義函數 (純量和資料表值) 和使用者定義彙總函式。


因為我原先以為這個是開啟授權的正解

所以多了這個題外話 (現在修文了)

2013/12/22

是你教小孩學會亂花錢/騙錢的嗎?

你是否曾經給你的小孩一筆零用錢

然後跟他說:「這零用錢你拿著,用完再跟我說。」

經過幾天之後再問他:「花完了沒?」

如果小孩回答:「還沒花完。」就不給他零用錢

如果小孩回答:「花完了。」就補足他零用錢

如果你這麼作了,那你就是在教小孩學會亂花錢/騙錢

為什麼會這樣?

因為這是獎勵小孩回答「花完了。」的機制

每當他回答「花完了。」,就會得到獎勵,獎勵是零用錢

這就會驅使小孩去亂花錢,或者說謊

曾經是小孩的我,也遇過這種情況。我當時的邏輯有兩套

一:「既然我把這筆錢花完就會有下一筆,那我何不很快的花完手上的錢呢?」

二:「我可以不把錢花完,卻跟大人說我已經花完了,那麼我就可以存到錢了!」


題外話

聽說政府預算編列的方法好像也類似這樣?

好像是個不把錢花完,錢就會變少的機制?

2013/12/13

閱讀 jquery 原始碼的筆記 - I don't like this

I_dont_like_this = function (key)
{
var nodes = document.querySelectorAll(key);
var l = nodes.length;
for(var i = 0; i <  l ; i++)
{
var node = nodes[i];
node.parentNode.removeChild(node);
}
}
I_dont_like_this("iframe.fb_ltr");
I_dont_like_this(".fb_iframe_widget");

這是我剛寫好,專門隱藏網站外掛FB按讚功能的函數,準備作成 chrome 外掛

document.querySelectorAll 這東西是瀏覽器內建的選擇器

我爬 jQuery 在第6456行找到的

SQL Server 備份還原 - 備份組包含現有的資料庫以外的資料庫備份

今天嘗試做資料庫的移機

做法是從A電腦的資料庫,按右鍵備份(選完整備份)

然後把備份檔複製到B電腦,在B電腦開一個新的資料庫,按右鍵還原

還原的時候遇到了這樣的錯誤訊息:備份組包含現有的資料庫以外的資料庫備份

爬了一下 google 文章

大部分的人是這樣解的:

===以下節錄其中一篇===

1.先執行以下的SQL

USE [master]
GO

restore database #資料庫名稱
from disk = '#備份資料庫檔路徑及檔名'
with
move '資料庫檔案邏輯名稱' to '資料庫mdf檔案所在位置',
move '資料庫記錄檔邏輯名稱' to '資料庫記錄檔ldf檔案所在位置',
NoRecovery,
Replace
go

執行完畢資料庫會呈現「還原中」

2.到要還原的資料庫上按右鍵→[工作]→[還原]→[資料庫]→[來源裝置]→瀏覽備份檔→勾選還原→確定
如此就完工了

===以上節錄其中一篇===

我看了覺得很怪 認為這個做法很不正常

於是繼續爬 Google 發現到另一個解法

===以下節錄另一個解===

SQL SERVER 資料庫備份:

  => 在資料庫上點右鍵 -> 工作 -> 備份 來建立備份。

 (第一次建完整,第二次以後就建差異備份)

 (一陣子可以重新再建立一次完整的備份)

 若出現“無法開啟備份裝置 'C:\123'。作業系統錯誤 5(存取被拒。)。"”

 -> 檢查SQL SERVER 組態管理員,SQL SERVER 的登入身份是否為LOCALSYSTEM

還原:

  => 在資料庫上右鍵 -> 工作 -> 還原 -> 資料庫

 若出現“備份組包含現有的xx資料庫以外的資料庫備份”時,

 在選項,勾選 覆寫現有的資料庫

===以上節錄另一個解===

這個看起來就很合理

但很多人搜尋到第一個解之後就寫一篇文紀念他

結果造成第一篇文的解法被發揚光大

所以我寫一篇文章 希望大家以後遇到這個問題可以選用第二個解

2013/12/6

閱讀 jquery 原始碼的筆記 - Array.slice 的妙用

在 jquery v1.10.2 裡面的第 232行寫到 :

toArray: function() {
return core_slice.call( this );
}

他的功能是把 jquery 物件從物件 {} 轉換成陣列 []
在這裡的 this 是個 jquery 物件
而 core_slice 是宣告在第 55 行 :

core_deletedIds = [],
core_slice = core_deletedIds.slice,

以上來自第48行和第55行
我們知道他宣告了一個變數  core_slice 把陣列的 slice 函數拿來用
 slice 能作什麼事呢?

這裡我們知道執行

var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1,3);

會得到

citrus = ["Orange","Lemon"];

的結果

根據測試我發現 core_slice.call(A) 的運作模式是先判斷 A 有無 length 屬性
如果有就 new 一個新的陣列 然後把對應的元素丟進新的陣列裡,如果沒有傳入參數的話就是全丟進去
嘗試實作看看 :

function slice(A, start, end) {
    var output = [];
    if (start == undefined) start = 0;
    if (end == undefined) end = A.length;
    if (start < 0) start = A.length + start;
    if (end < 0) end = A.length + end;
    for (var i = start; i < end; i++) {
        output.push(A[i]);
    }
    return output;

}

試用起來跟內建的一樣
可以測試以下程式碼

var o = {};
o.length = 5;
o[0] = 1;
slice(o);
[].slice.call(o);

閱讀 jquery 原始碼的筆記 - && 和 || 運算子的妙用


在 jquery v1.10.2 裡面的第 153行寫到:

context && context.nodeType ? context.ownerDocument || context : document,

它的實際意義是
如果 context 不存在 或者 context 沒有 nodeType 屬性時,傳回 document
如果 context 存在,而且 context 具有 nodeType 屬性時,嘗試傳回 context.ownerDocument ,如果 context.ownerDocument 不存在就改成傳回 context

為什麼可以這樣寫 ?

運算子 && 的功能

執行 A && B 假如A可以轉換為 false 就 return A 否則 return B

試著實作 function and(A,B){ if(Boolean(A) === false) return A; return B;}

結果發現 A && B 跟 and(A, B) 的運作結果完全相同

運算子 || 的功能

執行 A || B 假如 A 可以轉換為 true 就 return A 否則 return B

試著實作 function or(A,B){ if(Boolean(A) === true) return A; return B;}

結果發現 A || B 跟 or(A, B) 的運作結果完全相同



附上可以轉換為 false 的物件列表 (從這裡找到的)
0
-0
null
""
false
undefined
NaN
除了這些東西之外 丟進 Boolean 都會傳回 true