2007年11月10日土曜日
2007年11月9日金曜日
SQL Serverって主キーをupdate出来るんですね。
SQL Server2005Expressで確認しました。
で、Inside SQL Server2005ストレージ編には、updateがdeleteとinsertに分解され、主キーの順でソートされるそう。
でもそれだと以下の③はうまくいかない気がする。
deleteを先にやろうとすると外部キー制約に引っ掛かるはずなのに引っかからない。なんか特別な処理をしているのかな?
USE [pubs]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tbl](
[pk1] [int] NOT NULL,
[ux1] [int] NOT NULL,
CONSTRAINT [PK_tbl] PRIMARY KEY CLUSTERED
(
[pk1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
CONSTRAINT [IX_tbl] UNIQUE NONCLUSTERED
(
[ux1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tbl2](
[num] [int] NOT NULL,
[rel1] [int] NULL,
CONSTRAINT [PK_tbl2] PRIMARY KEY CLUSTERED
(
[num] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[tbl2] WITH CHECK ADD CONSTRAINT [FK_tbl2_tbl] FOREIGN KEY([rel1])
REFERENCES [dbo].[tbl] ([pk1])
GO
ALTER TABLE [dbo].[tbl2] CHECK CONSTRAINT [FK_tbl2_tbl]
GO
insert tbl(pk1,ux1) values(1,10);
insert tbl(pk1,ux1) values(2,20);
insert tbl2(num,rel1) values(100,2);
select * from tbl2
--以下は一意性エラー
update tbl set pk1=2 where pk1=1;
--以下は正常
begin tran;
update tbl set pk1=3-pk1
select * from tbl
rollback;
--以下は一意性エラー
update tbl set ux1=20 where ux1=10;
--以下はok
begin tran;
update tbl set ux1=30-ux1;
select * from tbl
rollback;
--③以下もok
begin tran;
update tbl set pk1=3-pk1, ux1=30-ux1;
select * from tbl
rollback;
それはそうと、主キーが変えられるとなると昔作ったトリガの設計が破綻することになるのか。はぁ。
昔作ったトリガは効率化のために、insertedとdeletedのテーブルを主キーで連結し前後の変化列を調べて変化に見合う処理を行っていたのだけれど、主キーが変えられると変化を追跡できない。
効率を無視して、deletedテーブルでdeleteに見合う処理を行って、insertedテーブルでinsertに見合うを行うというようにdeleteとinsertの処理を別々に処理しなければならなかったのかな。(こちらの方が条件式のバリエーションが減るし。)
で、Inside SQL Server2005ストレージ編には、updateがdeleteとinsertに分解され、主キーの順でソートされるそう。
でもそれだと以下の③はうまくいかない気がする。
deleteを先にやろうとすると外部キー制約に引っ掛かるはずなのに引っかからない。なんか特別な処理をしているのかな?
USE [pubs]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tbl](
[pk1] [int] NOT NULL,
[ux1] [int] NOT NULL,
CONSTRAINT [PK_tbl] PRIMARY KEY CLUSTERED
(
[pk1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
CONSTRAINT [IX_tbl] UNIQUE NONCLUSTERED
(
[ux1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tbl2](
[num] [int] NOT NULL,
[rel1] [int] NULL,
CONSTRAINT [PK_tbl2] PRIMARY KEY CLUSTERED
(
[num] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[tbl2] WITH CHECK ADD CONSTRAINT [FK_tbl2_tbl] FOREIGN KEY([rel1])
REFERENCES [dbo].[tbl] ([pk1])
GO
ALTER TABLE [dbo].[tbl2] CHECK CONSTRAINT [FK_tbl2_tbl]
GO
insert tbl(pk1,ux1) values(1,10);
insert tbl(pk1,ux1) values(2,20);
insert tbl2(num,rel1) values(100,2);
select * from tbl2
--以下は一意性エラー
update tbl set pk1=2 where pk1=1;
--以下は正常
begin tran;
update tbl set pk1=3-pk1
select * from tbl
rollback;
--以下は一意性エラー
update tbl set ux1=20 where ux1=10;
--以下はok
begin tran;
update tbl set ux1=30-ux1;
select * from tbl
rollback;
--③以下もok
begin tran;
update tbl set pk1=3-pk1, ux1=30-ux1;
select * from tbl
rollback;
それはそうと、主キーが変えられるとなると昔作ったトリガの設計が破綻することになるのか。はぁ。
昔作ったトリガは効率化のために、insertedとdeletedのテーブルを主キーで連結し前後の変化列を調べて変化に見合う処理を行っていたのだけれど、主キーが変えられると変化を追跡できない。
効率を無視して、deletedテーブルでdeleteに見合う処理を行って、insertedテーブルでinsertに見合うを行うというようにdeleteとinsertの処理を別々に処理しなければならなかったのかな。(こちらの方が条件式のバリエーションが減るし。)
2007年11月8日木曜日
2007年11月7日水曜日
2007年11月6日火曜日
2007年11月5日月曜日
ADO.NET2.0 3章まで読了
2章はデモだったが、3章はやっとプログラミングに。[SqlConnection]クラスの説明でまだSQLには届いていないが、まずはまとめ。
SqlConnectionクラスには、
メンバとしては接続文字列(タイムアウトなどセッション設定も含む)や接続文字列を分解したほぼ読み取り専用の各種プロパティがある。
メソッドとしては接続に関係する部分:Open,Close以外にトランザクション開始やdb変更や接続プールクリアや分散トランザクション/通常トランザクションの登録や接続の統計の取得&リセットと接続スキーマの取得と接続に設置するコマンド(CreateCommand)がある。
イベントとしては、SQL側でPRINTコマンド等で出力された文字列を取得するためのInfoMessageイベントと、接続状態が変更された時に通知されるStateChangeイベントの2つがあるとのこと。
SqlConnectionクラスには、
メンバとしては接続文字列(タイムアウトなどセッション設定も含む)や接続文字列を分解したほぼ読み取り専用の各種プロパティがある。
メソッドとしては接続に関係する部分:Open,Close以外にトランザクション開始やdb変更や接続プールクリアや分散トランザクション/通常トランザクションの登録や接続の統計の取得&リセットと接続スキーマの取得と接続に設置するコマンド(CreateCommand)がある。
イベントとしては、SQL側でPRINTコマンド等で出力された文字列を取得するためのInfoMessageイベントと、接続状態が変更された時に通知されるStateChangeイベントの2つがあるとのこと。
2007年11月4日日曜日
起きたのは夕方
今日も昼寝で、16:00頃まで寝てしまった。
最近日曜日になる度に生活リズムがくるってしまう。
1.土曜日に寝るのが30:00
2.起きるのが日曜の9:00
3.横になって気を失うのが13:00
いったいどれが悪いのだろう。。。
今日は、SQL Server2005 Enterprize 180日間評価版を、Windows2008RC0+VisualStudio2008Beta導入済のSempronPCに導入しました。
なんか、VisualStuido2008BetaはSQL Server2008 CTPに対応していないみたいだし。
ただね、ダウンロードサイズが約1Gで5時間ぐらいかけてダウンロードしました。会社に行けばMCP70-443の問題集本があって、そのふろくDVDについていので、会社までの往復で1時間30分ぐらいで持ってこれたんですね。
最近日曜日になる度に生活リズムがくるってしまう。
1.土曜日に寝るのが30:00
2.起きるのが日曜の9:00
3.横になって気を失うのが13:00
いったいどれが悪いのだろう。。。
今日は、SQL Server2005 Enterprize 180日間評価版を、Windows2008RC0+VisualStudio2008Beta導入済のSempronPCに導入しました。
なんか、VisualStuido2008BetaはSQL Server2008 CTPに対応していないみたいだし。
ただね、ダウンロードサイズが約1Gで5時間ぐらいかけてダウンロードしました。会社に行けばMCP70-443の問題集本があって、そのふろくDVDについていので、会社までの往復で1時間30分ぐらいで持ってこれたんですね。
登録:
投稿 (Atom)