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

Откуда:
Сообщений: 7
День добрый. Я пишу на java Ant-скрипт для развёртывания БД на машине каждого девелопера.
Считается что БД уже существует и нужно просто создать набор таблиц предварительно проверив их существование.
Проблема в том, что проверка почему-то всегда проходит как true и соответсвенно дальше выполняется CREATE.
C SQL до этого неработал. Что я денаю не так?
USE [test]
GO

IF (not exists (select 1 from information_schema.tables where table_name = '[concr_user]'))

CREATE TABLE [dbo].[concr_user](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[firstName] [nchar](30) NOT NULL,
	[lastName] [nchar](30) NOT NULL,
	[passwoSELECT     
FROM         concr_userrd] [nchar](30) NOT NULL,
	[login] [nchar](30) NOT NULL,
 CONSTRAINT [PK_concr_user] PRIMARY KEY CLUSTERED 
(
	[Id] 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
24 май 11, 13:30    [10699772]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
select 1 from information_schema.tables where table_name = 'concr_user'
24 май 11, 13:31    [10699780]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
1d0
Member

Откуда: инфа100%
Сообщений: 2521
paynd
USE [test]
GO

[b]IF not exists (select 1 from information_schema.tables where table_name = '[concr_user]')[/b]

CREATE TABLE [dbo].[concr_user](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[firstName] [nchar](30) NOT NULL,
	[lastName] [nchar](30) NOT NULL,
	[passwoSELECT     
FROM         concr_userrd] [nchar](30) NOT NULL,
	[login] [nchar](30) NOT NULL,
 CONSTRAINT [PK_concr_user] PRIMARY KEY CLUSTERED 
(
	[Id] 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
24 май 11, 13:34    [10699810]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
iljy
Member

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

if object_id('concr_user','U') is null CREATE TABLE...
24 май 11, 13:35    [10699823]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
здесь будет типовая фраза про то, что юзеру для самой проверки существования таблицы тоже нужны права
24 май 11, 14:34    [10700269]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
paynd
Member

Откуда:
Сообщений: 7
iljy
paynd,
if object_id('concr_user','U') is null CREATE TABLE...

Спасибо, после этого заработало.
Поясни пожалуста что именно делает данный код!
object_id('concr_user','U') 
?

2Shakill - пользователь имеет все права. Проверил.
21d0 - имеешь ввиду скобка лишняя? Вроде бы ничего в этом случае не изменилось.
24 май 11, 15:54    [10700973]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
1d0
Member

Откуда: инфа100%
Сообщений: 2521
paynd
iljy
paynd,
if object_id('concr_user','U') is null CREATE TABLE...

Спасибо, после этого заработало.
Поясни пожалуста что именно делает данный код!
object_id('concr_user','U') 
?

2Shakill - пользователь имеет все права. Проверил.
21d0 - имеешь ввиду скобка лишняя? Вроде бы ничего в этом случае не изменилось.


скобка должна быть после if not exist
USE [test]
GO

IF not exists (select 1 from information_schema.tables where table_name = '[concr_user]')

CREATE TABLE [dbo].[concr_user](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[firstName] [nchar](30) NOT NULL,
	[lastName] [nchar](30) NOT NULL,
	[passwoSELECT     
FROM         concr_userrd] [nchar](30) NOT NULL,
	[login] [nchar](30) NOT NULL,
 CONSTRAINT [PK_concr_user] PRIMARY KEY CLUSTERED 
(
	[Id] 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
24 май 11, 15:56    [10700992]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
paynd
Member

Откуда:
Сообщений: 7
Похоже дело именно в правах.
24 май 11, 16:18    [10701192]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
скорее в схемах
24 май 11, 16:26    [10701255]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Зайцев Фёдор
скорее в схемах

блин, как-то я наизнанку прочитал тему. не в схемах )
24 май 11, 16:28    [10701279]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
1d0,

права тут не при чем

create table dbo.test (i int)
select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'test'
select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = '[test]'
drop table dbo.test

вам уже указали что [] не нужны в запросе

IF not exists (select 1 from information_schema.tables where table_name = '[concr_user]')
24 май 11, 16:33    [10701313]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
Glory
Member

Откуда:
Сообщений: 104751
paynd
Похоже дело именно в правах.

сравните два запроса
select 1 from information_schema.tables where table_name = '[concr_user]'
select 1 from information_schema.tables where table_name = 'concr_user'
24 май 11, 16:33    [10701316]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Зато в OBJECT_ID() можно задавать имена и в квадратных скобках и без, со схемой и без и т.д.
24 май 11, 16:52    [10701475]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
paynd
Member

Откуда:
Сообщений: 7
Запускал скрипты из MS SQL studio.
Если:
IF not exists (select 1 from information_schema.tables where table_name = '[concr_user]')
CREATE TABLE [dbo].[concr_user](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[firstName] [nchar](30) NOT NULL,
      [lastName] [nchar](30) NOT NULL,
      [password] [nchar](30) NOT NULL,
      [login] [nchar](30) NOT NULL,
) ON [PRIMARY]
GO
Всё работает.
В случа же:

USE [test]
GO
IF not exists (select 1 from information_schema.tables where table_name = '[concr_user]')
CREATE TABLE [dbo].[concr_user](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[firstName] [nchar](30) NOT NULL,
      [lastName] [nchar](30) NOT NULL,
      [password] [nchar](30) NOT NULL,
      [login] [nchar](30) NOT NULL,
) ON [PRIMARY]
GO
There is already an object named 'concr_user' in the database.


А, к примеру:
USE [users]
;
if object_id('concr_user','U') is null
CREATE TABLE [dbo].[concr_user](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [firstName] [nchar](30) NOT NULL,
      [lastName] [nchar](30) NOT NULL,
      [password] [nchar](30) NOT NULL,
      [login] [nchar](30) NOT NULL,
      CONSTRAINT [PK_concr_user] PRIMARY KEY CLUSTERED(
      [Id] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
;
Прокатывает полностью.
Хочу понять в чём именно дело.
автор
Glory

Картинка с другого сайта.

Картинка с другого сайта.
24 май 11, 17:53    [10701929]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
Glory
Member

Откуда:
Сообщений: 104751
paynd
Хочу понять в чём именно дело.

Вы все еще думаете, что скобки [] являются частью именования объектов ?
24 май 11, 17:56    [10701944]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
paynd
Member

Откуда:
Сообщений: 7
Glory
paynd
Хочу понять в чём именно дело.

Вы все еще думаете, что скобки [] являются частью именования объектов ?

Видимо нет.
24 май 11, 18:00    [10701972]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Glory
paynd
Хочу понять в чём именно дело.

Вы все еще думаете, что скобки [] являются частью именования объектов ?

могут ведь )

create table "[qwe]" (n int)
select * from information_schema.tables where table_name = '[qwe]'
drop table "[qwe]"
24 май 11, 18:00    [10701979]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
Glory
Member

Откуда:
Сообщений: 104751
paynd
Glory
пропущено...

Вы все еще думаете, что скобки [] являются частью именования объектов ?

Видимо нет.

По вашему скрипту с IF not exists (select 1 from information_schema.tables where table_name = '[concr_user]') это незаметно
24 май 11, 18:01    [10701990]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
paynd
Member

Откуда:
Сообщений: 7
Glory
paynd
пропущено...

Видимо нет.

По вашему скрипту с IF not exists (select 1 from information_schema.tables where table_name = '[concr_user]') это незаметно

Ладно, нельзя. Но почему же он сработал? :(
24 май 11, 18:17    [10702108]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
paynd,
почему же,как раз сработал ...
24 май 11, 18:18    [10702124]     Ответить | Цитировать Сообщить модератору
 Re: создание таблицы при условии IF NOT EXISTS ...  [new]
paynd
Member

Откуда:
Сообщений: 7
Maxx
paynd,
почему же,как раз сработал ...

Туплю.
24 май 11, 18:29    [10702207]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить