2012-05-11 21 views
2

EDIT:修正済みです。私がやったことは、データベースの所有者を、私がそれに接続するのに使ったユーザーとは違ったものに変更することでした。データベース所有者を確認するには:SqlDependencyはOnChangeイベントを発生させません。

select name, suser_sname(owner_sid) from sys.databases 

を所有者を変更するには:

ALTER AUTHORIZATION ON DATABASE::ISS TO sa; 

これはかなりそれだった、私はまだその理由を知らないが、それはそううん、クールな作品。 (以前のdbownerがいくつかの権利を失っていたのかもしれません)

これは私に長すぎる頭痛を与えています。なぜこれが起こっているのか全く分かりません。私はMark Nischalkeのプロジェクトをhttp://www.codeproject.com/Articles/12335/Using-SqlDependency-for-data-change-eventsから取りました。プロジェクトにはデータベースを作成するためのSQLスクリプトと、プロジェクト/データベースにSqlDependecyの起動があります。今私は以前のデータベースに問題があることを知り、スクリプトをコピーして自分のデータベースを作成しました。テーブルを除いてすべてが同じです(明らかに)。これは、同じ構成のデータベースを別のデータベースにも持っているので、私のSqlDependencyが機能するはずです。しかし、いいえ...それは動作しません。この時点で私のプロジェクトで私は彼のデータベースの通知を確認するSqlDependecyを変更し、それは動作しますので、私のプロジェクトでは.NETの問題ではありません。その後、私は彼のプロジェクトチェックの私のデータベースとSopeDependencyを作成しようとしましたが、まだ動作しません。どちらの場合も、同じ接続文字列、統合されたセキュリティを使用しますが、初期カタログは異なります。助けてくれてありがとう。

これは彼のデータベース作成スクリプトが

です(私はプロジェクトSqlDependecy.Stopが、イベントイマイチ」発射を閉じたときにもメッセージキューは、私のデータベースに作成され、削除され、注意する)

USE [master] 
GO 
/****** Object: Database [Chatter] Script Date: 11/18/2005 13:55:20 ******/ 
CREATE DATABASE [Chatter] ON PRIMARY 
(NAME = N'Chatter', FILENAME = N'D:\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Chatter.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB) 
LOG ON 
(NAME = N'Chatter_log', FILENAME = N'D:\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Chatter_log.ldf' , SIZE = 1536KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) 
COLLATE SQL_Latin1_General_CP1_CI_AS 
GO 
EXEC dbo.sp_dbcmptlevel @dbname=N'Chatter', @new_cmptlevel=90 
GO 
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) 
begin 
EXEC [Chatter].[dbo].[sp_fulltext_database] @action = 'disable' 
end 
GO 
ALTER DATABASE [Chatter] SET ANSI_NULL_DEFAULT OFF 
GO 
ALTER DATABASE [Chatter] SET ANSI_NULLS OFF 
GO 
ALTER DATABASE [Chatter] SET ANSI_PADDING OFF 
GO 
ALTER DATABASE [Chatter] SET ANSI_WARNINGS OFF 
GO 
ALTER DATABASE [Chatter] SET ARITHABORT OFF 
GO 
ALTER DATABASE [Chatter] SET AUTO_CLOSE OFF 
GO 
ALTER DATABASE [Chatter] SET AUTO_CREATE_STATISTICS ON 
GO 
ALTER DATABASE [Chatter] SET AUTO_SHRINK OFF 
GO 
ALTER DATABASE [Chatter] SET AUTO_UPDATE_STATISTICS ON 
GO 
ALTER DATABASE [Chatter] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO 
ALTER DATABASE [Chatter] SET CURSOR_DEFAULT GLOBAL 
GO 
ALTER DATABASE [Chatter] SET CONCAT_NULL_YIELDS_NULL OFF 
GO 
ALTER DATABASE [Chatter] SET NUMERIC_ROUNDABORT OFF 
GO 
ALTER DATABASE [Chatter] SET QUOTED_IDENTIFIER OFF 
GO 
ALTER DATABASE [Chatter] SET RECURSIVE_TRIGGERS OFF 
GO 
ALTER DATABASE [Chatter] SET ENABLE_BROKER 
GO 
ALTER DATABASE [Chatter] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO 
ALTER DATABASE [Chatter] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO 
ALTER DATABASE [Chatter] SET TRUSTWORTHY OFF 
GO 
ALTER DATABASE [Chatter] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO 
ALTER DATABASE [Chatter] SET PARAMETERIZATION SIMPLE 
GO 
ALTER DATABASE [Chatter] SET READ_WRITE 
GO 
ALTER DATABASE [Chatter] SET RECOVERY FULL 
GO 
ALTER DATABASE [Chatter] SET MULTI_USER 
GO 
ALTER DATABASE [Chatter] SET PAGE_VERIFY CHECKSUM 
GO 
ALTER DATABASE [Chatter] SET DB_CHAINING OFF 

/***************************************************/ 

USE [Chatter] 
GO 
/****** Object: Table [dbo].[Message] Script Date: 11/18/2005 13:56:39 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Message](
    [int] [bigint] IDENTITY(1,1) NOT NULL, 
    [Message] [nvarchar](200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [Person_ID] [int] NOT NULL, 
CONSTRAINT [PK_Message] PRIMARY KEY CLUSTERED 
(
    [int] ASC 
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

USE [Chatter] 
GO 
/****** Object: Table [dbo].[Person] Script Date: 11/18/2005 13:56:56 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Person](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

USE [Chatter] 
GO 
/****** Object: StoredProcedure [dbo].[usp_GetMessages] Script Date: 11/18/2005 13:59:20 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROC [dbo].[usp_GetMessages] 

AS 

SELECT [Message], [Name] 
FROM dbo.[Message] 
JOIN dbo.Person ON id = [Message].Person_ID 

USE [Chatter] 
GO 
/****** Object: StoredProcedure [dbo].[usp_InsertMessage] Script Date: 11/18/2005 13:59:35 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROC [dbo].[usp_InsertMessage] 
    @Message nvarchar(200), 
    @Person_ID int 
AS 

INSERT INTO [Message] ([Message], Person_ID) 
VALUES (@Message, @Person_ID) 
GO 
/****************************************/ 
INSERT INTO [Chatter].[dbo].[Person] 
([Name]) 
VALUES('Larry') 
GO 
INSERT INTO [Chatter].[dbo].[Person] 
([Name]) 
VALUES('Moe') 
GO 
INSERT INTO [Chatter].[dbo].[Person] 
([Name]) 
VALUES('Curly') 

そして、これはあなたがあなたの基礎となる表の構造体で不正なデータタイプを持っているかもしれない、私のデータベース作成スクリプト(私は「ISS」とすべての「Chatterのを」置き換え)

USE [master] 
GO 
/****** Object: Database [ISS] Script Date: 11/18/2005 13:55:20 ******/ 
CREATE DATABASE [ISS] ON PRIMARY 
(NAME = N'ISS', FILENAME = N'D:\iss.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB) 
LOG ON 
(NAME = N'ISS_log', FILENAME = N'D:\iss_log.ldf' , SIZE = 1536KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) 
COLLATE SQL_Latin1_General_CP1_CI_AS 
GO 
EXEC dbo.sp_dbcmptlevel @dbname=N'ISS', @new_cmptlevel=90 
GO 
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) 
begin 
EXEC [ISS].[dbo].[sp_fulltext_database] @action = 'disable' 
end 
GO 
ALTER DATABASE [ISS] SET ANSI_NULL_DEFAULT OFF 
GO 
ALTER DATABASE [ISS] SET ANSI_NULLS OFF 
GO 
ALTER DATABASE [ISS] SET ANSI_PADDING OFF 
GO 
ALTER DATABASE [ISS] SET ANSI_WARNINGS OFF 
GO 
ALTER DATABASE [ISS] SET ARITHABORT OFF 
GO 
ALTER DATABASE [ISS] SET AUTO_CLOSE OFF 
GO 
ALTER DATABASE [ISS] SET AUTO_CREATE_STATISTICS ON 
GO 
ALTER DATABASE [ISS] SET AUTO_SHRINK OFF 
GO 
ALTER DATABASE [ISS] SET AUTO_UPDATE_STATISTICS ON 
GO 
ALTER DATABASE [ISS] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO 
ALTER DATABASE [ISS] SET CURSOR_DEFAULT GLOBAL 
GO 
ALTER DATABASE [ISS] SET CONCAT_NULL_YIELDS_NULL OFF 
GO 
ALTER DATABASE [ISS] SET NUMERIC_ROUNDABORT OFF 
GO 
ALTER DATABASE [ISS] SET QUOTED_IDENTIFIER OFF 
GO 
ALTER DATABASE [ISS] SET RECURSIVE_TRIGGERS OFF 
GO 
ALTER DATABASE [ISS] SET ENABLE_BROKER 
GO 
ALTER DATABASE [ISS] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO 
ALTER DATABASE [ISS] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO 
ALTER DATABASE [ISS] SET TRUSTWORTHY OFF 
GO 
ALTER DATABASE [ISS] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO 
ALTER DATABASE [ISS] SET PARAMETERIZATION SIMPLE 
GO 
ALTER DATABASE [ISS] SET READ_WRITE 
GO 
ALTER DATABASE [ISS] SET RECOVERY FULL 
GO 
ALTER DATABASE [ISS] SET MULTI_USER 
GO 
ALTER DATABASE [ISS] SET PAGE_VERIFY CHECKSUM 
GO 
ALTER DATABASE [ISS] SET DB_CHAINING OFF 

USE [ISS] 

create table sectii (
    cods int identity(0,1) primary key, 
    denumire varchar(30) not null, 
)   

create table useri (
    codu int identity(0,1) primary key, 
    login varchar(20) not null, 
    password varchar(30) not null, 
    cods int foreign key references sectii(cods), 
    tip int not null, 
) 

create table medicamente (
    codm int identity(0,1) primary key, 
    denumire varchar(50) not null 
) 

create table comenzi (
    codc int identity(0,1) primary key, 
    cods int foreign key references sectii(cods), 
    data datetime not null, 
    codu int foreign key references useri(codu), --nu e nevoie 
    onorata bit 
) 

create table medicamente_comanda (
    codc int foreign key references comenzi(codc) ON DELETE CASCADE, 
    codm int foreign key references medicamente(codm), 
    cantitate int 
)        
+1

すごいものを解決! dbの所有者を変更してください!それも私のために働いた!ありがとう。 –

+0

回答:http://stackoverflow.com/a/1764771/52277同様の質問は、SqlNotificationEventArgs引数の値を確認することを提案します。 TypeがChangeで、Sourceがデータ変更を通知したDataの場合のみ。 –

答えて

1

です醜い、または他の何らかの違法な犯罪者。私はこの記事をチェックアウトし、「サポートされているSELECTステートメント」セクションの下のすべての基準満たすことを確認することをお勧めしたい:

http://msdn.microsoft.com/en-us/library/ms181122%28v=sql.105%29.aspx

+0

お返事ありがとうございます。あなたのリンクを確認したところ、間違ったデータタイプを選択するべきではありません。私はすべての必要な設定をドキュメント、ANSI_NULLS ONなどに設定し、それでも動作しません。私のコマンドテキストは次のとおりです: "dbo。[comenzi]からのSELECT [データ](データはdatetime)であり、動作しません。私が他のDBを使用する場合、コマンドは "SELECT [Message] from dbo。[Message]"(Messageはvarcharです)で動作します。 – Bogdan

+0

データベースに対してService Brokerを有効にしましたか? ALTER DATABASE dbname SET ENABLE_BROKER; –

+0

もちろん、私が言ったように、2つのデータベースがあり、どちらも同じ設定(コピーされているので)、1つは通知を送信する、もう1つは設定しないでください。 – Bogdan

0

は、この文がハング場合は

ALTER DATABASE kmsdta SET ENABLE_BROKER; 

を実行していることを確認しますブローカー

alter database kmsdta set enable_broker with rollback immediate; 

を有効また、あなたがあなたのDababase

でこれを実行したことを確認し、このいずれかを使用
CREATE QUEUE ContactChangeMessages; 

CREATE SERVICE ContactChangeNotifications 
    ON QUEUE ContactChangeMessages 

と前のコードで

  1. テーブルを監視するために、SqlDependencyを使用する際に考慮すべきいくつかの重要なことは、あなたが私のSQLクエリはすべての列を返すために、「」ワイルドカードを使用していないことがわかります。必要な正確な列を返さなければなりません。 「」を使用すると、悪影響が生じます。

  2. また、前のコードでは、私のSQLクエリに「2つの部分」のテーブル名が含まれていることがわかります。これも必要です。 "owner.TableName"の代わりに "TableName"だけを使用すると、望ましくない結果も発生します。単純なクエリのための

例:

select OrderID from dbo.[DTAOrders]; 
関連する問題