批量更改sql server數據庫所有者的對象

因為一些網站是使用虛擬主機。用sql-server導數據上去的話,數據庫的用戶默認是你登錄的用戶,不是dbo,有時就和本地產生不一致。

–功能說明:成批更改數據庫所有者的對象

–用法:exec ChangeObjectOwner ‘nmkspro’,’dbo’

–即可將所有nmkspro所有者的對象改為dbo所有 Chinaz~com

–運行成功後將提示:”注意: 更改對象名的任一部分都可能破壞腳本和存儲過程。”
CREATE PROCEDURE dbo.ChangeObjectOwner
@OldOwner as NVARCHAR(128),–參數原所有者
@NewOwner as NVARCHAR(128)–參數新所有者
AS

DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128) DECLARE curObject CURSOR FOR
select ‘Name’ = name,
‘Owner’ = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + ‘.’ + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end Chinaz~com
FETCH NEXT FROM curObject INTO @Name, @Owner
END
close curObject
deallocate curObject
GO

————————————————————–
批量修改:
EXEC sp_MSforeachtable ‘exec sp_changeobjectowner ”?”,”dbo” ‘

單個修改:
exec sp_changeobjectowner ‘要改的表名’,’dbo’

————————————————————–
方法一:直接點擊該表-》設計-》屬性-》更改上面的所有者。該方法針對於表少的情況下。

方法二:利用腳本直接執行,用系統帳號或者登陸到該數據庫,然後執行下面語句:
sp_configure ‘allow updates’,’1′
go
reconfigure with override
go
update sysobjects set uid=1 where uid<>1 –根據條件可以任意修改,在多用戶之間切換。
go
sp_configure ‘allow updates’,’0′
go
reconfigure with override 站長.站

.NET 透過 SqlConnection 連接 SQL Server 的連線字串

最簡單的連線字串,是以信任連線的方式連接 SQL Server 資料庫,字串如下:

Server=ServerAddress;Database=DataBaseName;Trusted_Connection=True;

ServerAddress是資料庫伺服器的名稱,DataBaseName則是所要連接的資料庫名稱,Trusted_Connection設為True,表示直接透過信任連線連接,因此不需要指定帳號密碼資料。

無論使用C#或是VB.NET,當你要透過ADO.NET連接SQL Server資料庫的時候,必須指定連接字串,這篇文章,我們來看一下相關連線字串的彙總。

最簡單的連線字串,是以信任連線的方式連接 SQL Server 資料庫,字串如下:

Server=ServerAddress;Database=DataBaseName;Trusted_Connection=True;

ServerAddress是資料庫伺服器的名稱,DataBaseName則是所要連接的資料庫名稱,Trusted_Connection設為True,表示直接透過信任連線連接,因此不需要指定帳號密碼資料。

底下是非信任連線的狀況,其中的Trusted_Connection設定為flase,因此必須再指定ID與Password兩個屬性值給他,這兩個值分別代表開啟資料庫所需的帳號與密碼:

Server=ServerAddress;Database=DataBaseName;User ID=Username;Password=Password;Trusted_Connection=False;

除了上述的語法,你也可以利用以下的替代語法:

Data Source=ServerAddress;Initial Catalog=DataBaseName;Integrated Security=SSPI;
Data Source=ServerAddress;Initial Catalog=DataBaseName;User Id=myUsername;Password=myPassword;

「Integrated Security=SSPI」的意義與「Trusted_Connection=True」的相同,其他的幾個項目則對應至相同的屬性。

另外,你也可以透過指定 IP Address 的方式,連接逺端資料庫,字串如下,要特別注意的是,其中的Data Source除了IP位址,最後一個數字「1433」,是SQL Server的預設連接埠:

Data Source=192.168.100.100,1433;Network Library=DBMSSOCN;
Initial Catalog=DataBaseName;User ID=Username;Password=PasswordName;

如果你使用的是SQL Server Express版本,則連線字串是相同的,差別只在於Server名稱必須加上一個SQLEXPRESS ,如下式:

Server=ServerAddress\SQLEXPRESS ;Database=DataBaseName;Trusted_Connection=True;

由於.NET 2.0所釋出的SQL Server Express版本,允許開發人員直接以資料庫檔案的型式,進行資料庫存取維護,就如同Access資料庫,對於這種類型的資料連線字串又與上述的不同,請參考「SQL Server Express 資料庫檔案的連線字串」。

SQL Server Express 資料庫檔案的連線字串

這一篇是針對SQL Server Express版本的資料庫檔案連接作說明,如果你想要了解的是SQL Server 2005或是一般用法的SQL Server Express 請參考「.NET 透過 SqlConnection 連接 SQL Server 的連線字串」

.NET 2.0所釋出的SQL Server Express版本,允許開發人員直接以資料庫檔案的型式,進行資料庫存取維護,就如同Access資料庫,Express 資料庫檔案的連線字串與SQL Server並不相同,這一篇文章,我們來看看這些字串的內容。

我們先來看看最典型的字串格式,列舉如下:

Server=.\SQLExpress;AttachDbFilename=databasefilepath;
Integrated Security=True;User Instance=True;

AttachDbFilename表示所要連接的資料庫檔案其所在位置路徑,假設你有一個叫作 「sample.mdf」的檔案,位於路徑「C:\db\dbsub」路徑底下,則必須指定此 AttachDbFilename 的參數值如下:

AttachDbFilename=C:\db\dbsub\sample.mdf

如果你不想要寫死路徑,則必須透過「DataDirectory」指定路徑,格式如下:

Server=.\SQLExpress;AttachDbFilename=|DataDirectory|sample.mdf;
Integrated Security=True;User Instance=True;

其中的DataDirectory取代了原來的實體路徑,不過這樣作的話,你必須確認資料庫檔案是放在系統資料夾裏面,例如ASP.NET專案裏的[ App_Data] ,如此一來,當你在部署開發完成的網站的時候,就不需要擔心找應用程式找不到資料庫檔案了。

MySQL需注意的幾點tips

1、用mysql內置函數轉換ip地址和數字
利用兩個內置函數
inet_aton:將ip地址轉換成數字型
inet_ntoa:將數字型轉換成ip地址

2、充分利用mysql內置的format函數
尤其是在處理字符格式的時候,例如將12345轉換成12,345這樣的,只要用:format(12345,0)即可,如果用format(12345,2)則顯示的是12,345.00了…

3、利用mysql的內置函數處理時間戳問題
eg : select FROM_UNIXTIME(UNIX_TIMESTAMP(),’%Y %D %M %h:%i:%s %x’);
結果: 2004 3rd August 03:35:48 2004

4、利用mysql_convert_table_format轉換表類型
需要DBI和DBD的mysql相關模組支援才能用,例子:
mysql_convert_table_format –user=root –password=’xx’ –type=myisam test yejr

5、修改mysql表中的字段名
alter table tb_name change old_col new_col definition…

6、利用臨時變數
select @var1:=a1+a2 as a_sum,@var2:=b1+b2 as b_sum,@var1+@var2 as total_sum from test_table xxx;

7、用int類型存儲ip地址
原先錯誤的認為必須用bigint才夠,後來發現使用int unsigned類型就足夠了。 :)

8、CREATE TABLE IF NOT EXISTS … select 語法局限
儘管只是對目標表的insert操作,但是‘居然’不允許源表的insert操作,真是莫名其妙

9、利用IF函數快速修改ENUM字段值
一個例子:
update rule set enable = if(‘0′ = enable,’1′,’0’) where xxx;
enable 類型:enum(‘0′,’1’) not null default ‘0’

10、事務無法嵌套

11、避免長時間的sleep連接造成的連接數超出問題
設定全局變數 wait_timeout 和 interactive_timeout 為比較小的值,例如 10(s),就能使每個sleep連接在10s之後如果還沒有查詢的話自動斷開。

MySQL的數值類型

11.2. 數值類型

MySQL支援所有標準SQL數值資料類型。這些類型包括嚴格數值資料類型(INTEGERSMALLINTDECIMALNUMERIC),以及近似數值資料類型(FLOATREALDOUBLE PRECISION)。關鍵字INTINTEGER的同義詞,關鍵字DECDECIMAL的同義詞。

BIT資料類型保存位欄位值,並且支援MyISAMMEMORYInnoDBBDB表。

作為SQL標準的擴展,MySQL也支援整數類型TINYINTMEDIUMINTBIGINT。下面的表顯示了需要的每個整數類型的存儲和範圍。

類型

位元組

最小值

最大值

 

 

(帶符號的/無符號的)

(帶符號的/無符號的)

TINYINT

1

-128

127

 

 

0

255

SMALLINT

2

-32768

32767

 

 

0

65535

MEDIUMINT

3

-8388608

8388607

 

 

0

16777215

INT

4

-2147483648

2147483647

 

 

0

4294967295

BIGINT

8

-9223372036854775808

9223372036854775807

 

 

0

18446744073709551615

MySQL還支持選擇在該類型關鍵字後面的括弧內指定整數值的顯示寬度(例如,INT(4))。該可選顯示寬度規定用於顯示寬度小於指定的列寬度的值時從左側填滿寬度。

顯示寬度並不限制可以在列內保存的值的範圍,也不限制超過列的指定寬度的值的顯示。

當結合可選擴展屬性ZEROFILL使用時, 默認補充的空格用零代替。例如,對於聲明為INT(5) ZEROFILL的列,值4檢索為00004。請注意如果在整數列保存超過顯示寬度的一個值,當MySQL為複雜聯接生成臨時表時會遇到問題,因為在這些情況下MySQL相信資料適合原列寬度。

所有整數類型可以有一個可選(非標準)屬性UNSIGNED。當你想要在列內只允許非負數和該列需要較大的上限數值範圍時可以使用無符號值。

浮點和定點類型也可以為UNSIGNED。同數類型,該屬性防止負值保存到列中。然而,與整數類型不同的是,列值的上範圍保持不變。

如果為一個數值列指定ZEROFILLMySQL自動為該列添加UNSIGNED屬性。

對於浮點列類型,在MySQL中單精確度值使用4個位元組,雙精度值使用8個位元組。

FLOAT類型用於表示近似數值資料類型。SQL標準允許在關鍵字FLOAT後面的括弧內選擇用位指定精度(但不能為指數範圍)MySQL還支援可選的只用於確定存儲大小的精度規定。023的精度對應FLOAT列的4位元組單精確度。2453的精度對應DOUBLE列的8位元組雙精度。

MySQL允許使用非標準語法:FLOAT(M,D)REAL(M,D)DOUBLE PRECISION(M,D)。這裏,“(M,D)”表示該值一共顯示M位元整數,其中D位元位於小數點後面。例如,定義為FLOAT(7,4)的一個列可以顯示為-999.9999MySQL保存值時進行四捨五入,因此如果在FLOAT(7,4)列內插入999.00009,近似結果是999.0001

MySQLDOUBLE視為DOUBLE PRECISION(非標準擴展)的同義詞。MySQL還將REAL視為DOUBLE PRECISION(非標準擴展)的同義詞,除非SQL伺服器模式包括REAL_AS_FLOAT選項。

為了保證最大可能的可攜性,需要使用近似數值資料值存儲的代碼應使用FLOATDOUBLE PRECISION,不規定精度或位數。

DECIMALNUMERIC類型在MySQL中視為相同的類型。它們用於保存必須為確切精度的值,例如貨幣資料。當聲明該類型的列時,可以(並且通常要)指定精度和標度;例如:

salary DECIMAL(5,2)

在該例子中,5是精度,2是標度。精度表示保存值的主要位數,標度表示小數點後面可以保存的位數。

MySQL 5.1中以二進位格式保存DECIMALNUMERIC值。

標準SQL要求salary列能夠用5位元整數位元和兩位元小數保存任何值。因此,在這種情況下可以保存在salary列的值的範圍是從-999.99999.99

在標準SQL中,語法DECIMAL(M)等價於DECIMAL(M,0)。同樣,語法DECIMAL等價於DECIMAL(M,0),可以通過計算確定M的值。在MySQL 5.1中支援DECIMALNUMERIC資料類型的變數形式。M預設值是10

DECIMALNUMERIC的最大位數是65,但具體的DECIMALNUMERIC列的實際範圍受具體列的精度或標度約束。如果此類列分配的值小數點後面的位數超過指定的標度允許的範圍,值被轉換為該標度。(具體操作與作業系統有關,但一般結果均被截取到允許的位數)。

BIT資料類型可用來保存位欄位值。BIT(M)類型允許存儲M位元值。M範圍為164

要指定位值,可以使用b’value符。value是一個用01編寫的二進位值。例如,b’111′b’100000000′分別表示7128。參見9.1.5節,“位欄位值”

如果為BIT(M)列分配的值的長度小於M位,在值的左邊用0填充。例如,為BIT(6)列分配一個值b’101′,其效果與分配b’000101′相同。

當要在一個數值列內保存一個超出該列允許範圍的值時,MySQL的操作取決於此時有效的SQL模式。如果模式未設置,MySQL將值裁剪到範圍的相應端點,並保存裁減好的值。但是,如果模式設置為traditional(“嚴格模式”),超出範圍的值將被拒絕並提示錯誤,並且根據SQL標準插入會失敗。參見5.3.2節,“SQL伺服器模式”

如果INT列是UNSIGNED,列範圍的大小相同,但其端點會變為到04294967295。如果你試圖保存-99999999999999999999,以非嚴格模式保存到列中的值是04294967296

如果在浮點或定點列中分配的值超過指定(或默認)精度和標度規定的範圍,MySQL以非嚴格模式保存表示範圍相應端點的值。

MySQL沒有工作在嚴格模式時,對於ALTER TABLELOAD DATA INFILEUPDATE和多行INSERT語句,由於裁剪發生的轉換將報告為警告。當MySQL工作在嚴格模式時,這些語句將失敗,並且部分或全部值不會插入或更改,取決於是否表為事務表和其他因素。詳情參見5.3.2節,“SQL伺服器模式”

 

mysql4,mysql4.1,mysql 5共存

由於工作需要,要按這三個玩意。因為舊系統用MYSQL 4,而MYSQL 4.1多了比如外鍵功能,
MYSQL5 更是多了存儲過程等東西,因此嘗試共存在一機器上。
其實很簡單,
mysql 4.1MYSQL 5的安裝包已經非常自動化了,但要注意設置好不同的埠。
比如
mysql 4偶用的是3306,MYSQL 4.1我用3308MYSQL5偶用3309,安裝時,都選擇都安裝成為WINDOWS的服務。

之後是管理拉,一向推薦用phpmyadmin的,但這次比較麻煩,要建立多兩個目錄,
一個是管理
mysql 4.1的,一個是管理mysql 5的,分別叫做phpmyadmin41,phpmyadmin5
注意更改
config,.php中的
$cfg[‘Servers’][$i][‘port’] = ‘3309’;
這裏為相應的埠
然後還要注意的是,mysql 4.1mysql 5都改了認證方式,因為,先分別在DOS下連上mysql 4.1mysql 5,
之後,都用這樣的方式進行修改

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(‘newpwd’)
-> WHERE Host = ‘some_host’ AND User = ‘some_user’;
mysql> FLUSH PRIVILEGES;
之後在用IE,分別用如
http://localhost:8081/phpmyadmin4
http://localhost:8081/phpmyadmin41
http://localhost:8081/phpmyadmin5,
就可以很容易地管理這三個MYSQL