Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проверка сущестования таблицы в БД (ms sql 2008r2)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Подскажите пожалуйста, если у пользователя только роль Public в БД
как корректно проверить существование:
1. таблицы в БД?
2. временной таблицы в БД?
14142418

ms sql 2008r2
7 май 13, 11:27    [14266433]     Ответить | Цитировать Сообщить модератору
 Re: Проверка сущестования таблицы в БД (ms sql 2008r2)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
trew
Подскажите пожалуйста, если у пользователя только роль Public в БД
как корректно проверить существование:
1. таблицы в БД?
2. временной таблицы в БД?
14142418

ms sql 2008r2
Если есть права на просмотр метаданных, то
if OBJECT_ID('схема.Таблица','U') is not null 


Иначе никак.
7 май 13, 11:33    [14266483]     Ответить | Цитировать Сообщить модератору
 Re: Проверка сущестования таблицы в БД (ms sql 2008r2)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
alexeyvg
trew
Подскажите пожалуйста, если у пользователя только роль Public в БД
как корректно проверить существование:
1. таблицы в БД?
2. временной таблицы в БД?
14142418

ms sql 2008r2
Если есть права на просмотр метаданных, то
if OBJECT_ID('схема.Таблица','U') is not null 



Иначе никак.
Ну почему же?!
Можно попробовать создать таблицу.
Если таблица есть (и даже прав никаких на неё нет),
то вернётся сообщение об ошибке с соответствующим текстом.
7 май 13, 11:41    [14266554]     Ответить | Цитировать Сообщить модератору
 Re: Проверка сущестования таблицы в БД (ms sql 2008r2)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
iap
Ну почему же?!
Можно попробовать создать таблицу.
Если таблица есть (и даже прав никаких на неё нет),
Я думал об этом...
Но ИМХО если нет прав на метаданные, то нет прав и на создание таблиц...
7 май 13, 11:55    [14266646]     Ответить | Цитировать Сообщить модератору
 Re: Проверка сущестования таблицы в БД (ms sql 2008r2)  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
iap
Можно попробовать создать таблицу.
Если таблица есть (и даже прав никаких на неё нет),
то вернётся сообщение об ошибке с соответствующим текстом.
Сработает, если есть разрешение на создание таблиц.
7 май 13, 11:56    [14266656]     Ответить | Цитировать Сообщить модератору
 Re: Проверка сущестования таблицы в БД (ms sql 2008r2)  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
trew
1. таблицы в БД?
Например, выполнить
select * from таблица
Если таблицы нет, получите ошибку 208. Иначе либо запрос выполнится, либо будет ошибка 229
trew
2. временной таблицы в БД?
А наличие времянки как раз можно проверять
if OBJECT_ID('tempdb..#Таблица', 'U') is not null 
7 май 13, 12:37    [14266952]     Ответить | Цитировать Сообщить модератору
 Re: Проверка сущестования таблицы в БД (ms sql 2008r2)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
invm
trew
1. таблицы в БД?
Например, выполнить
select * from таблица

Если таблицы нет, получите ошибку 208. Иначе либо запрос выполнится, либо будет ошибка 229
trew
2. временной таблицы в БД?
А наличие времянки как раз можно проверять
if OBJECT_ID('tempdb..#Таблица', 'U') is not null 
А наличие глобальной временной таблицы?
7 май 13, 12:41    [14266988]     Ответить | Цитировать Сообщить модератору
 Re: Проверка сущестования таблицы в БД (ms sql 2008r2)  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
iap
А наличие глобальной временной таблицы?
Такая проверка требует особого подхода?
7 май 13, 13:00    [14267163]     Ответить | Цитировать Сообщить модератору
 Re: Проверка сущестования таблицы в БД (ms sql 2008r2)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
invm
iap
А наличие глобальной временной таблицы?
Такая проверка требует особого подхода?
По сравнению с локальной?
USE tempdb;
GO
CREATE TABLE #T(X INT);
CREATE TABLE ##T(XX INT);
GO
CREATE PROC P AS
SELECT OBJECT_ID(N'tempdb..#T','U');
CREATE TABLE #T(X INT);
SELECT OBJECT_ID(N'tempdb..##T','U');
CREATE TABLE ##T(X INT);
GO
EXEC P;
GO
DROP PROC P;
DROP TABLE #T,##T;
Кстати говоря, в этом примере видно, что могут существовать более одной локальной временной таблицы.
И что даёт проверка OBJECT_ID() в этом случае, - вообще говоря, неясно.
7 май 13, 13:16    [14267299]     Ответить | Цитировать Сообщить модератору
 Re: Проверка сущестования таблицы в БД (ms sql 2008r2)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
iap
Кстати говоря, в этом примере видно, что могут существовать более одной локальной временной таблицы.
И что даёт проверка OBJECT_ID() в этом случае, - вообще говоря, неясно
Ну понятно, для случая локальной временной таблицы можно проверить её наличие, только если сам её создавал.

То есть это то, что проверить можно гарантированно, в остальных случаях только с какими то допущениями (впрочем, проверить существование глобльной временной таблицы тоже можно всегда).
7 май 13, 13:49    [14267570]     Ответить | Цитировать Сообщить модератору
 Re: Проверка сущестования таблицы в БД (ms sql 2008r2)  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
iap,

Ваш пример демонстрирует лишь документированное поведение, но не необходимость особого подхода к проверке существования глобальной временной таблицы. В случае же множества одноименных локальных временных таблиц, функция OBJECT_ID будет возвращать идентификатор ближайшей, в разрезе scope, таблицы:
use tempdb;
go

create table #t (i int);
go

create procedure dbo.Proc1
as
begin
 select object_name(@@procid), object_name(object_id('tempdb..#t', 'U'));
 create table #t (i int);
 select object_name(@@procid), object_name(object_id('tempdb..#t', 'U'));
end;
go

create procedure dbo.Proc2
as
begin
 exec dbo.Proc1;
 
 select object_name(@@procid), object_name(object_id('tempdb..#t', 'U'));
 create table #t (i int);
 select object_name(@@procid), object_name(object_id('tempdb..#t', 'U'));
end;
go

select object_name(@@procid), object_name(object_id('tempdb..#t', 'U'));
exec dbo.Proc2;
go

drop procedure dbo.Proc2, dbo.Proc1;
drop table #t;
go


alexeyvg,

Я уже писал - гарантированно проверить можно, отловив 208 ошибку компиляции.
7 май 13, 14:30    [14267854]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить