Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как обойти ошибку 911?  [new]
Kiasyd
Member

Откуда:
Сообщений: 6
Моя задача состояла в следующем: написать обычный скрипт создания таблиц в БД Orba, если такой БД не существует, должно появиться сообщение, мол " Сначала создайте БД". При проверки выдает следующую ошибку: Server: Msg 911, Level 16, State 1, Line 6
Could not locate entry in sysdatabases for database 'Orba'. No entry found with that name. Make sure that the name is entered correctly.
Вопрос в следующем, как можно это обойти?

Скрипт:
+
if not exists (SELECT name FROM master.dbo.sysdatabases WHERE name = 'Orba')
print 'Сначала выполните 1-й запрос'
else 

Begin 
use Orba
if exists (select*from dbo.sysobjects where id=object_id(N'[Year]') and objectproperty(id, N'isusertable') = 1)
print 'Создать таблицу Year невозможно, поскольку таблица с таким названием уже существует.'
else
create table Year
( 
ID int not null,
Year int not null
)
if exists (select*from dbo.sysobjects where id = object_id(N'[Course]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Course невозможно, поскольку таблица с таким названием уже существует.'
else
create table Course
( 
ID int not null,
Number decimal(1) not null ,
Year_ID int not null
)
if exists (select * from dbo.sysobjects where id = object_id(N'[Semester]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Semester невозможно, поскольку таблица с таким названием уже существует.'
else
create table Semester
( 
ID int not null,
Name char(10) not null,
Course_ID int not null
)

if exists (select * from dbo.sysobjects where id = object_id(N'[Gr0up_Hours]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Gr0up_Hours невозможно, поскольку таблица с таким названием уже существует.'
else
create table Gr0up_Hours
( 
ID int not null,
Hours_ID int not null,
Gr0up_ID int not null
)


if exists (select * from dbo.sysobjects where id = object_id(N'[Gr0up]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Gr0up невозможно, поскольку таблица с таким названием уже существует.'
else
create table Gr0up
( 
ID int not null,
Name varchar(10) not null,
Semester_ID int not null
)

if exists (select * from dbo.sysobjects where id = object_id(N'[Hours]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Hours невозможно, поскольку таблица с таким названием уже существует.'
else
create table Hours
( 
ID int not null,
Hours decimal(3) not null,
Discipline_ID int not null
)

if exists (select * from dbo.sysobjects where id = object_id(N'[Discipline]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Discipline невозможно, поскольку таблица с таким названием уже существует.'
else
create table Discipline
( 
ID int not null,
Name varchar(50) not null,
)

if exists (select * from dbo.sysobjects where id = object_id(N'[Mark]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Mark невозможно, поскольку таблица с таким названием уже существует.'
else
create table Mark
( 
ID int not null,
Grade decimal(1) not null,
Student_ID int not null,
Discipline_ID int not null
)
if exists (select * from dbo.sysobjects where id = object_id(N'[Student]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Student невозможно, поскольку таблица с таким названием уже существует.'
else
create table Student
( 
ID int not null,
Number decimal(2) not null,
Date_of_birth datetime not null,
Sex_ID int not null,
Gr0up_ID int not null,
Surname_ID int not null,
Name_ID int not null,
Patronymic_ID int not null,
Flat_ID int not null
)
if exists (select * from dbo.sysobjects where id = object_id(N'[Flat]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Flat невозможно, поскольку таблица с таким названием уже существует.'
else
create table Flat
( 
ID int not null,
Number varchar(10) not null,
House_ID int not null,
)

if exists (select * from dbo.sysobjects where id = object_id(N'[House]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу House невозможно, поскольку таблица с таким названием уже существует.'
else
create table House
( 
ID int not null,
Number varchar(10) not null,
Street_ID int not null,
)

if exists (select * from dbo.sysobjects where id = object_id(N'[Street]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Street невозможно, поскольку таблица с таким названием уже существует.'
else
create table Street
( 
ID int not null,
Name varchar(50) not null,
City_ID int not null,
)

if exists (select * from dbo.sysobjects where id = object_id(N'[City]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу City невозможно, поскольку таблица с таким названием уже существует.'
else
create table City
( 
ID int not null,
Name varchar(50) not null,
Region_ID int not null,
)

if exists (select * from dbo.sysobjects where id = object_id('[Region]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Region невозможно, поскольку таблица с таким названием уже существует.'
else
create table Region
( 
ID int not null,
Name varchar(50) not null,
)

if exists (select * from dbo.sysobjects where id = object_id('[Sex]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Sex невозможно, поскольку таблица с таким названием уже существует.'
else
create table Sex
( 
ID int not null,
Name varchar(7) not null,
)

if exists (select * from dbo.sysobjects where id = object_id('[Surname]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Surname невозможно, поскольку таблица с таким названием уже существует.'
else
create table Surname
( 
ID int not null,
Name varchar(50) not null,
)

if exists (select * from dbo.sysobjects where id = object_id('[Name]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Name невозможно, поскольку таблица с таким названием уже существует.'
else
create table Name
( 
ID int not null,
Name varchar(50) not null,
)

if exists (select * from dbo.sysobjects where id = object_id('[Patronymic]') and objectproperty (id, N'isusertable') = 1)
print 'Создать таблицу Patronymic невозможно, поскольку таблица с таким названием уже существует.'
else
create table Patronymic
( 
ID int not null,
Name varchar(50) not null,
)
End


Сообщение было отредактировано: 11 июн 14, 19:42
11 июн 14, 19:26    [16156664]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
нету у вас такой базы и нет доступа к ней.
11 июн 14, 19:40    [16156709]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
a_voronin
нету у вас такой базы и нет доступа к ней.


use Orba
GO

и это нельзя обернуть в транзакцию

можно извернуться

EXEC sp_executesql N' EXEC Orba.dbo.sp_executesql '' ... ваш скрипт в контексте Orba  '' '


но затрахаетесь с кавычками
11 июн 14, 19:44    [16156717]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
а чем скриптик-то будет выполняться?
11 июн 14, 20:12    [16156815]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Kiasyd
Member

Откуда:
Сообщений: 6
Crimean, Не уверен, что правильно понял вас. Не мог ли бы вы пояснить?
12 июн 14, 13:53    [16158676]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Kiasyd
Member

Откуда:
Сообщений: 6
a_voronin, а не подскажете где можно об этом подробней узнать?
12 июн 14, 13:55    [16158681]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kiasyd
Не уверен, что правильно понял вас. Не мог ли бы вы пояснить?

Какой программой вы собрались выполнять ваш скрипт ?

ЗЫ
Большинство команд CREATE тоже должны выполняться в отдельном пакете
12 июн 14, 14:11    [16158706]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
дело в том, что вот такой подход:

use master
go

if exists ( select 1 from sys.databases where name = 'MyDB' ) return

create database MyDB
go

use mydb
go

use master
go


"вполне себе". но у нас на стороне сервера нет возможности в первом батче сказать, чтобы далее не выполнялись остальные батчи - для этого нужна или жесткая динамика (что сильно хуже) или "внешнее" управление (что сильно лучше) в смысле хоть в батник это завернуть и уже в батнике по факту "слета" важного батча просто прекратить дальнейшую работу всего батника
12 июн 14, 16:17    [16158964]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Crimean
у нас на стороне сервера нет возможности в первом батче сказать, чтобы далее не выполнялись остальные батчи
Почему же? Вполне типичная ситуация для применения noexec:
set noexec off;
go

use master;
if db_id('MyDB') is not null
 set noexec on;
go

create database MyDB;
go

use MyDB;
go

...
12 июн 14, 17:19    [16159111]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Crimean
"вполне себе". но у нас на стороне сервера нет возможности в первом батче сказать, чтобы далее не выполнялись остальные батчи - для этого нужна или жесткая динамика (что сильно хуже) или "внешнее" управление (что сильно лучше) в смысле хоть в батник это завернуть и уже в батнике по факту "слета" важного батча просто прекратить дальнейшую работу всего батника
Если выполнять гарантированно под админом, то можно генерить исключение с большим severity, приводящее к отключению коннекта.
12 июн 14, 21:09    [16159633]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Kiasyd
if exists (select*from dbo.sysobjects where id=object_id(N'[Year]') and objectproperty(id, N'isusertable') = 1)
Боже мой, это вместо:
IF (Object_ID(N'[dbo].[Year]','N') IS NULL)
И схему не опускайте никогда, особенно тут.
a_voronin
и это нельзя обернуть в транзакцию
Обвернуть то можно. Нельзя так легко прекратить выполнение.
a_voronin
EXEC sp_executesql
Вот взяли и испугали человека непонятными названиями. И не нужно обворачивать 2 раза.
Проверить базу можно и повторно в начале 2-го батча.
SET XACT_ABORT ON;
BEGIN TRAN TCreateDB
-- ...
IF (Object_ID(N'[dbo].[Year]','U') IS NULL) EXEC (N'
CREATE TABLE [dbo].[Year] (
	ID	Int	NOT NULL CONSTRAINT [PK_Year] PRIMARY KEY
,	[Year]	Int	NOT NULL
)');
IF (Object_ID(N'[dbo].[Course]','U') IS NULL) EXEC (N'
CREATE TABLE [dbo].[Course] (
	ID	Int		NOT NULL CONSTRAINT [PK_Course] PRIMARY KEY
,	Number	Decimal(1)	NOT NULL
,	Year_ID	Int		NOT NULL
)');
-- ...
COMMIT TRAN TCreateDB;
И всё равно отложенная компиляция спасёт отца русской демократии.
EXEC sys.sp_sqlexec 'CREATE DATABASE [BlaBla] ...'
EXEC [BlaBla].sys.sp_sqlexec 'Bla-Bla ...'
Это даже называется не отложенная компиляция. Ибо:
DECLARE @SPName SysName = 'tempdb.sys.sp_sqlexec'
EXEC @SPName 'PRINT 1;'
Вызов процедурного объекта (процедуры или скалярной процедуры) делается по имени.
13 июн 14, 02:58    [16160500]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Старые тяхнологии. Давно уже можно применить хоть тот же Data-tier Application, хоть скриптом, хоть кодом. Чё вы ласапеды изобретаете?
И ткните это вашему руководству, что отстали лет на 5-7.
13 июн 14, 02:59    [16160503]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
свои 5 коп
Напишите исталятор БД на Повершелл и не партесь .. первый вызов ф-ци проверка налияия БД и вперед,удобно, подерживаеться мс и доступно куча обьектов из СМО
13 июн 14, 10:47    [16160713]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Kiasyd
Member

Откуда:
Сообщений: 6
Maxx, проблема в том, что задача состоит в написании скрипта с использованием средств Ms sql server...
13 июн 14, 14:38    [16161211]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Kiasyd
Maxx, проблема в том, что задача состоит в написании скрипта с использованием средств Ms sql server...

если так то вам уже вообщем ответили , но соврешенно не понятно почему именно такая постановка задачи :(
13 июн 14, 15:21    [16161278]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Kiasyd,

совет - пересмотрите задачу. серьезно. отвлеченный пример - "сложно" логировать невозможность подключения к сиквелу на этом же сиквеле, потому как к нему подключиться нельзя, ага?
вот и у вас примерно так же
можно долго и упорно строить себе лисапед и после держать его на подпорках, а можно чуть сдвинуть постановку и сделать норм решение, которое после не будет выедать все мозги
у вас же явно ваши скрипты "нечто" или "некто" будут выполнять. вот там и прячется весьма эффективный способ сделать то, что вы хотите сделать _только_ на стороне сервера без привлечения внешних средств. ну так вот - привлеките. вам об этом все говорят в этой ветке
13 июн 14, 15:21    [16161279]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Mnior
Боже мой, это вместо:
IF (Object_ID(N'[dbo].[Year]','N') IS NULL)
Точности ради:
IF (Object_ID(N'[dbo].[Year]','U') IS NULL)
13 июн 14, 16:01    [16161390]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку 911?  [new]
Kiasyd
Member

Откуда:
Сообщений: 6
Все получилось! Спасибо всем откликнувшимся)))
14 июн 14, 17:11    [16163291]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить