1

私の SQL Server 2008 R2 には、正常に生成されるデータベース スクリプトがありますが、そのスクリプトを実行しようとすると、Executing query メッセージのみが表示され、何も起こりません。結果が出るまで少なくとも 10 分待っていましたが、強制的にそのクエリの実行を停止する必要があります。

注: 他のすべてのクエリは正常に機能していますが、上記で説明したようにデータベース スクリプトのみが実行されていません。

何が起こっているのかわかりません...

詳細: これは特定のデータベースで発生するのではなく、SQL Server のすべてのデータベースで発生する問題です。

例で見てみましょう。
SQL Server 2008 R2 には、次のタイプのスクリプトがあります。

USE [master]
GO
/****** Object:  Database [BillingApplication]    Script Date: 01/22/2013 17:42:04 ******/
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'BillingApplication')
BEGIN
CREATE DATABASE [BillingApplication] ON  PRIMARY 
( NAME = N'BillingApplication', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\BillingApplication.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'BillingApplication_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\BillingApplication_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
END
GO
ALTER DATABASE [BillingApplication] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [BillingApplication].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [BillingApplication] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [BillingApplication] SET ANSI_NULLS OFF
GO
ALTER DATABASE [BillingApplication] SET ANSI_PADDING OFF
GO
ALTER DATABASE [BillingApplication] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [BillingApplication] SET ARITHABORT OFF
GO
ALTER DATABASE [BillingApplication] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [BillingApplication] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [BillingApplication] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [BillingApplication] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [BillingApplication] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [BillingApplication] SET CURSOR_DEFAULT  GLOBAL
GO
ALTER DATABASE [BillingApplication] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [BillingApplication] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [BillingApplication] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [BillingApplication] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [BillingApplication] SET  DISABLE_BROKER
GO
ALTER DATABASE [BillingApplication] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [BillingApplication] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [BillingApplication] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [BillingApplication] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [BillingApplication] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [BillingApplication] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [BillingApplication] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [BillingApplication] SET  READ_WRITE
GO
ALTER DATABASE [BillingApplication] SET RECOVERY FULL
GO
ALTER DATABASE [BillingApplication] SET  MULTI_USER
GO
ALTER DATABASE [BillingApplication] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [BillingApplication] SET DB_CHAINING OFF
GO
EXEC sys.sp_db_vardecimal_storage_format N'BillingApplication', N'ON'
GO
USE [BillingApplication]
GO
/****** Object:  Table [dbo].[tbCustBill]    Script Date: 01/22/2013 17:42:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbCustBill]') AND type in (N'U'))
BEGIN
                    -- And continue the entire script

SQL Server プロファイラーで見たように、次のコードが完全に機能するまでの実行よりも.

    ALTER DATABASE [BillingApplication] SET RECURSIVE_TRIGGERS OFF
        GO

そして、実行中の次の行で停止になります。
何が起こっているのかわかりません....
強制的に実行を完全に停止すると、以下のようなエラーが生成されます

メッセージ 5069、レベル 16、状態 1、行 1 ALTER DATABASE ステートメントが失敗しました。

それで、それはいくつかのSQLサーバー構成の問題かもしれません...

4

2 に答える 2

4

この設定を変更するには、データベースに排他ロックを設定できることを確認する必要があると思います。データベースを作成したばかりでも、複数の接続を確立している可能性があります。Management Studio で IntelliSense が無効になっていること、このデータベースに他のウィンドウが接続されていないこと、およびコンテキストを別のデータベースに切り替えていることを確認してください。次に、データベースをシングル ユーザーに設定し、変更を加えて元に戻します。

USE master;
GO

ALTER DATABASE BillingApplication SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

ALTER DATABASE BillingApplication SET RECURSIVE_TRIGGERS OFF;
GO

ALTER DATABASE BillingApplication SET DISABLE_BROKER;    
GO

... other changes ...

ALTER DATABASE BillingApplication SET MULTI_USER;
GO

それでも待機する場合は、非常に大きなトランザクションのロールバックを待機している可能性があります。別のウィンドウでsys.dm_exec_requestsおよび/またはを見て、待機しているものを確認できますsys.dm_os_waiting_tasks

ただし、データベースを作成している場合、なぜ明示的にブローカーを無効にする必要があると思いますか? デフォルトでは有効になっていません...

于 2013-01-22T14:50:59.407 に答える
0

あなたが持っている

ALTER DATABASE [BillingApplication] SET DISABLE_BROKER

あねなし。ON_ OFFそれを設定すると、動作するはずです。


いいえ、そうではありません。Service Broker サブシステムと関係があると思いますが、それは私がよく知らないことです。そのシステムを知っている他の誰かがこれに答えてくれることを願っています...\

于 2013-01-22T14:43:02.797 に答える