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

Откуда: Москва
Сообщений: 344
В базе данных вызывается процедура из базы Master. Процедура должна обратиться к содержимому таблици в той базе откуда вызывается процедура.
IF EXISTS(select 1 from dbo.sysobjects where id = object_id(N'[dbo].[test]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
IF EXISTS(SELECT *FROM dbo.[test])
Смысл в том что первая строка проходит нормально - т.е. да, таблица есть, вторая выдает ошибку:
Invalid object name 'dbo.Test'.
В чем может быть дело?
26 фев 06, 17:09    [2391736]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по видимости таблиц  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
1. Первая строка возвращает true или false? Если false, то что означает "проходит нормально "?
2. А как вы решили, что процедура из базы master есть системная, т.е. работает в контексте той базы, из которой она вызывается?
26 фев 06, 17:51    [2391927]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по видимости таблиц  [new]
www.perlscript.ru
Member

Откуда: Москва
Сообщений: 344
Ошибка вылетает на строке
IF EXISTS(SELECT *FROM dbo.[test])
поэтому понятно, что результат первой строки = TRUE
Не совсем понял второй вопрос.
Вызывается приложением
EXEC sp_ИмяСистемнойпроцедуры
27 фев 06, 12:39    [2394093]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по видимости таблиц  [new]
ChA
Member

Откуда: Москва
Сообщений: 11137
www.perlscript.ru
Не совсем понял второй вопрос.
Вызывается приложением
EXEC sp_ИмяСистемнойпроцедуры
USE master
GO

CREATE PROCEDURE sp_test
AS
IF EXISTS(select 1 from dbo.sysobjects where id = object_id(N'[dbo].[test]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
IF EXISTS(SELECT * FROM dbo.[test]) BEGIN
	PRINT 'YES !'
	RETURN
END
PRINT 'NO !'
GO


USE pubs
GO
CREATE TABLE test(id int)
PRINT '1'
EXEC sp_test
GO

USE master
GO
EXEC sp_MS_marksystemobject 'sp_test'
GO

USE pubs
GO
PRINT '2'
EXEC sp_test
PRINT '3'
INSERT INTO test SELECT 1
EXEC sp_test
GO

USE master
GO
DROP PROCEDURE sp_test

USE pubs
GO
DROP TABLE test
За использование недокументированных системных процедур отвечаете сами :)
27 фев 06, 13:28    [2394381]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по видимости таблиц  [new]
www.perlscript.ru
Member

Откуда: Москва
Сообщений: 344
Вывод:
1
Server: Msg 208, Level 16, State 1, Procedure sp_test, Line 6
Invalid object name 'dbo.test'.
2
NO !
3

(1 row(s) affected)

YES !
27 фев 06, 13:49    [2394502]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по видимости таблиц  [new]
www.perlscript.ru
Member

Откуда: Москва
Сообщений: 344
Понятно, то есть если процедура не помечена как системная, то она не видит локальный контекст базы, из которой вызывается?
Получается я делаю ALTER системной процедуры, она автоматом помечается как USER-ская, потом надо ее сделать системной...
27 фев 06, 13:54    [2394534]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить