2012-05-11 5 views
2

EDIT: Я исправил его. То, что я сделал, это изменить владельца базы данных на нечто иное, чем пользователь, которого я использовал для подключения к нему. Для проверки владельца базы данных:SqlDependency не запускает событие OnChange

select name, suser_sname(owner_sid) from sys.databases 

Для изменения владельца:

ALTER AUTHORIZATION ON DATABASE::ISS TO sa; 

Это было в значительной степени это, я до сих пор не знаю причину этого, но это работает, так что да, круто. (Может быть, предыдущий dbowner отсутствовал некоторые права?)

Это дает мне головные боли слишком долго, и я совершенно не понимаю, почему это происходит. Короче говоря, я взял проект Марка Нищалке из: http://www.codeproject.com/Articles/12335/Using-SqlDependency-for-data-change-events. Проект имеет SQL-скрипт для создания базы данных, а SqlDependecy запускается в его проекте/базе данных. Теперь я знал, что у меня проблемы с моими предыдущими базами данных, и я скопировал его скрипт и создал свою собственную базу данных. Все идентично, за исключением таблиц (очевидно). Это означает, что моя SqlDependency должна работать, поскольку у меня есть идентично настроенная база данных для другой, которая работает; но нет ... это не работает. На данный момент, в моем проекте я изменил SqlDependecy, чтобы проверить его базу данных для уведомлений, и она работает, поэтому это не проблема .NET в моем проекте. Затем я попытался сделать SqlDependency в его проверке проекта моей базы данных и нет, все еще не работает. В обоих случаях я использую одну и ту же строку соединения, интегрированную безопасность, но разные исходные каталоги. Спасибо за любую помощь.

(Также к сведению, что MessageQueue создается на моей базе данных и удаляются при закрытии SqlDependecy.Stop проекта, но и Isnt»обжиг событие)

Это его сценарий создания базы данных

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') 

И это мое создание базы данных скрипт (я просто заменил все «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 is Change и Source is Data, где вы уведомили об изменении данных. –

ответ

1

Вы можете иметь неправильный тип данных в вашей базовой таблице структуры или какой-либо другой незаконной добыче. Я предлагаю проверить эту статью и убедившись, что вы соответствуете всем критериям, изложенным в разделе «Поддерживаемый ЗЕЬЕСТА»:

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

+0

Спасибо за ответ. Я проверил вашу ссылку, и я не должен выбирать неправильный тип данных. Я установил все необходимые настройки документации, ANSI_NULLS ON и т. Д., И он все еще не работает. Мой текст команды: «SELECT [data] from dbo. [Comenzi]» (данные datetime), и он не работает. Когда я использую другой БД, команда «SELECT [Сообщение] из dbo. [Сообщение]» (Сообщение является varchar), и оно работает. – Bogdan

+0

Вы включили Service Broker для своей базы данных? ALTER DATABASE dbname SET ENABLE_BROKER; –

+0

Конечно, как я уже сказал, есть две базы данных, оба должны иметь одинаковые настройки (поскольку я их скопировал), один отправляет уведомления, другой - нет. – 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 

и некоторые важные вещи, которые необходимо учитывать при использовании SqlDependency следить за столом

  1. В предыдущем коде, вы заметите, что мой SQL запрос не использует «» подстановочные вернуть все столбцы , Вы ДОЛЖНЫ возвращать точные столбцы, которые вы хотите. Если вы используете «», у вас будут плохие последствия.

  2. Также в предыдущем коде вы заметите, что мой SQL-запрос содержит имя таблицы «две части». Это также НЕОБХОДИМО. Использование просто «TableName» вместо «owner.TableName» также приведет к нежелательным последствиям.

пример для простого запроса:

select OrderID from dbo.[DTAOrders]; 
Смежные вопросы