Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Владельцев sql 2005 прошу помочь.  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
Есть предположение что данный код не работает на sql 2005.
По крайней мере на 2000 этот код работает.
А у меня установлены

Microsoft SQL Server 2005 - 9.00.1116 (Intel X86)
Apr 9 2005 20:56:37
Copyright (c) 1988-2004 Microsoft Corporation
Beta Edition on Windows NT 5.1 (Build 2600: Service Pack 2)

И нижеприведенны код дает вот такую ошибку.
Msg 208, Level 16, State 1, Line 7
Invalid object name 'dbo.fn_GlobalID'.
result from TestDB_1..t1_On_TestDB_1:
result from TestDB_2..t1_On_TestDB_2:


А вот и сам код.
Проверьте пожалуйста и сообщите результаты, с версией системы.
set nocount on
set ansi_nulls on
set ansi_warnings on
go
-------------------------- master ----------------------------------------
use master
go

-- add 'loopback' linkedserver 
if exists (select * from master..sysservers where srvname = 'loopback')
    exec sp_dropserver 'loopback'
go
exec sp_addlinkedserver @server = N'loopback',
    @srvproduct = N'',
    @provider = N'SQLOLEDB', 
    @datasrc = @@servername
go

-- create table tGlobalID for Global ID
if object_id('tGlobalID', 'U') > 0 drop table tGlobalID
go
create table tGlobalID
(
    id int primary key nonclustered, 
    GlobalID bigint
)
go
insert into tGlobalID(id, GlobalID) values(1, 0)
go

------------------------- TestDB_1 ----------------------------------------
if not exists(select 1 from master..sysdatabases where name = 'TestDB_1')
    create database TestDB_1
go
use TestDB_1
go

-- drop constraint DF_t1_On_TestDB_1
if exists(select * from sysobjects where name = 'DF_t1_On_TestDB_1' and type = 'D' and parent_obj = object_id('t1_On_TestDB_1', 'U'))
    alter table t1_On_TestDB_1 drop constraint DF_t1_On_TestDB_1 
go

-- Create function fn_GlobalID(). 
-- Вариант от Glory. Хотя я где-то видел на форуме что эта конструкция не всегда правельно работает. (найду, покажу)  
if object_id('fn_GlobalID','FN') > 0 drop function fn_GlobalID
go
create function fn_GlobalID()
returns bigint
as
begin
    declare @GlobalID  bigint
    select @GlobalID = GlobalID from openquery(loopback, '
        set nocount on 
        set implicit_transactions off
        declare @GlobalID bigint 
        update master..tGlobalID set @GlobalID = GlobalID = GlobalID + 1 where id = 1 
        select @GlobalID as GlobalID
')
    return @GlobalID
end
go

-- create table t1_On_TestDB_1
if object_id('t1_On_TestDB_1', 'U') > 0 drop table t1_On_TestDB_1
go
create table t1_On_TestDB_1
(
    GlobalID bigint primary key nonclustered constraint DF_t1_On_TestDB_1 DEFAULT dbo.fn_GlobalID() ,
    f1 varchar(10)
)
go

------------------------- TestDB_2 ----------------------------------------
if not exists(select 1 from master..sysdatabases where name = 'TestDB_2')
    create database TestDB_2
go
use TestDB_2
go

-- drop constraint DF_t1_On_TestDB_2
if exists(select * from sysobjects where name = 'DF_t1_On_TestDB_2' and type = 'D' and parent_obj = object_id('t1_On_TestDB_2', 'U'))
    alter table t1_On_TestDB_2 drop constraint DF_t1_On_TestDB_2
go

-- Create function fn_GlobalID()
if object_id('fn_GlobalID','FN') > 0 drop function fn_GlobalID
go
create function fn_GlobalID()
returns bigint
as
begin
    declare @GlobalID  bigint
    select @GlobalID = GlobalID from openquery(loopback, '
        set nocount on 
        set implicit_transactions off
        declare @GlobalID bigint 
        update master..tGlobalID set @GlobalID = GlobalID = GlobalID + 1 where id = 1 
        select @GlobalID as GlobalID
')
    return @GlobalID
end
go

-- create table t1_On_TestDB_2
if object_id('t1_On_TestDB_2', 'U') > 0 drop table t1_On_TestDB_2
go
create table t1_On_TestDB_2
(
    GlobalID bigint primary key nonclustered constraint DF_t1_On_TestDB_2 DEFAULT dbo.fn_GlobalID() ,
    f1 varchar(10)
)
go

----------------- TESTING -------------------------
use tempdb
go

declare @i int
set @i = 1
while @i <= 10
begin
    if ceiling(rand()*2) = 1
        insert into TestDB_1..t1_On_TestDB_1(f1) select '@i = ' + cast(@i as varchar(10))
    else
        insert into TestDB_2..t1_On_TestDB_2(f1) select '@i = ' + cast(@i as varchar(10))

    set @i = @i + 1
end
go

print 'result from TestDB_1..t1_On_TestDB_1:'
select * from TestDB_1..t1_On_TestDB_1
print 'result from TestDB_2..t1_On_TestDB_2:'
select * from TestDB_2..t1_On_TestDB_2
go



20 июл 05, 20:41    [1722231]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
RedLukPen
Member

Откуда:
Сообщений: 68
Alexander_fx
Есть предположение что данный код не работает на sql 2005.
По крайней мере на 2000 этот код работает.
А у меня установлены

Microsoft SQL Server 2005 - 9.00.1116 (Intel X86)
Apr 9 2005 20:56:37
Copyright (c) 1988-2004 Microsoft Corporation
Beta Edition on Windows NT 5.1 (Build 2600: Service Pack 2)

И нижеприведенны код дает вот такую ошибку.


Если написано, что инвалид - объект dbo.fn....., то скорее всего инвалид этот объект, а не сервер
20 июл 05, 21:17    [1722270]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
RedLukPen
Alexander_fx
Есть предположение что данный код не работает на sql 2005.
По крайней мере на 2000 этот код работает.
А у меня установлены

Microsoft SQL Server 2005 - 9.00.1116 (Intel X86)
Apr 9 2005 20:56:37
Copyright (c) 1988-2004 Microsoft Corporation
Beta Edition on Windows NT 5.1 (Build 2600: Service Pack 2)

И нижеприведенны код дает вот такую ошибку.


Если написано, что инвалид - объект dbo.fn....., то скорее всего инвалид этот объект, а не сервер


Вот и вопрос.
А что там может быть такоего инвалидного.
Весь код перед вами.
Только он у меня не работает а у автора работает. У него 2000 у меня 2005.
Вот и думаю на что валить. На свои кривые руки или на версию sql.
20 июл 05, 21:28    [1722280]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
RedLukPen
Member

Откуда:
Сообщений: 68
проходи по очереди каждую транзакцию (до каждого последующего GO), пока не появится ошибка, дальше - сообщи
20 июл 05, 21:45    [1722287]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Alexander_fx
Вот и думаю на что валить. На свои кривые руки или на версию sql.

Просто
select TestDB_1.dbo.fn_GlobalID()
работает ?
20 июл 05, 22:04    [1722297]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
to Glory
Работает
Возвращает 1

To RedLukPen
Дохожу до
declare @i int
set @i = 1
while @i <= 10
begin
    if ceiling(rand()*2) = 1
        insert into TestDB_1..t1_On_TestDB_1(f1) select '@i = ' + cast(@i as varchar(10))
    else
        insert into TestDB_2..t1_On_TestDB_2(f1) select '@i = ' + cast(@i as varchar(10))

    set @i = @i + 1
end

вылетает
Msg 208, Level 16, State 1, Line 8
Invalid object name 'dbo.fn_GlobalID'.
20 июл 05, 22:13    [1722303]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
RedLukPen
Member

Откуда:
Сообщений: 68
убери строчки

use tempdb
go

и попробуй еще раз
20 июл 05, 22:36    [1722317]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
Убрал
Msg 2627, Level 14, State 1, Line 8
Violation of PRIMARY KEY constraint 'PK__t1_On_TestDB_2__1F63A897'. Cannot insert duplicate key in object 'dbo.t1_On_TestDB_2'.
The statement has been terminated.
Msg 2627, Level 14, State 1, Line 8
Violation of PRIMARY KEY constraint 'PK__t1_On_TestDB_2__1F63A897'. Cannot insert duplicate key in object 'dbo.t1_On_TestDB_2'.
The statement has been terminated.
Msg 2627, Level 14, State 1, Line 8
Violation of PRIMARY KEY constraint 'PK__t1_On_TestDB_2__1F63A897'. Cannot insert duplicate key in object 'dbo.t1_On_TestDB_2'.
The statement has been terminated.
Msg 2627, Level 14, State 1, Line 6
Violation of PRIMARY KEY constraint 'PK__t1_On_TestDB_1__22401542'. Cannot insert duplicate key in object 'dbo.t1_On_TestDB_1'.
The statement has been terminated.
Msg 2627, Level 14, State 1, Line 6
Violation of PRIMARY KEY constraint 'PK__t1_On_TestDB_1__22401542'. Cannot insert duplicate key in object 'dbo.t1_On_TestDB_1'.
The statement has been terminated.
Msg 2627, Level 14, State 1, Line 6
Violation of PRIMARY KEY constraint 'PK__t1_On_TestDB_1__22401542'. Cannot insert duplicate key in object 'dbo.t1_On_TestDB_1'.
The statement has been terminated.
Msg 2627, Level 14, State 1, Line 6
Violation of PRIMARY KEY constraint 'PK__t1_On_TestDB_1__22401542'. Cannot insert duplicate key in object 'dbo.t1_On_TestDB_1'.
The statement has been terminated.
Msg 2627, Level 14, State 1, Line 6
Violation of PRIMARY KEY constraint 'PK__t1_On_TestDB_1__22401542'. Cannot insert duplicate key in object 'dbo.t1_On_TestDB_1'.
The statement has been terminated.
result from TestDB_1..t1_On_TestDB_1:
result from TestDB_2..t1_On_TestDB_2:

20 июл 05, 22:40    [1722325]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
RedLukPen
Member

Откуда:
Сообщений: 68
предыдущие транзакции отработаны заново?
20 июл 05, 22:45    [1722327]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
Если я правильно понял - то да.
Я удалил строчку Use temp и запустил код заново.
20 июл 05, 22:55    [1722334]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
Да кстати
если я делаю
select TestDB_1.dbo.fn_GlobalID()
то всегда возвращается 1
А по идее должно возвращатся возрастающее значение
20 июл 05, 23:05    [1722341]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
RedLukPen
Member

Откуда:
Сообщений: 68
дальше просто select-ами выбирай из своих таблиц и смотри где дублирутся первичные ключи и делай выводы - мне, например ясно, что сервер работает нормально
Если позволяет ситуация - грохни целиком сервак (или установи еще один новый) и еще раз на нем все тоже, только тестовую часть придумай другую - вроде все должно работать
20 июл 05, 23:13    [1722345]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
RedLukPen
дальше просто select-ами выбирай из своих таблиц и смотри где дублирутся первичные ключи и делай выводы - мне, например ясно, что сервер работает нормально
Если позволяет ситуация - грохни целиком сервак (или установи еще один новый) и еще раз на нем все тоже, только тестовую часть придумай другую - вроде все должно работать


ХМ
Что то я не догоняю.
Ключи дублируются по причине что функция пытается вставить одинаковое значение (1) в ключевое поле. Поэтому и ругань.
Что сервер работает нормально - это радует. Удалять пока нет причины.
Итого
С Use TempDb - сервер не находит нужную функцию ( ее просто нет в базе TempDb)
Без Use TempDb - мы работаем с базой TestDB_2
Но тут функция работает некорректно - всегда возврашает 1.

Что делать?
20 июл 05, 23:40    [1722363]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
мимо проходил
Guest
че за конструкция такая не врубаюсь

update master..tGlobalID set @GlobalID = GlobalID = GlobalID + 1 where id = 1
21 июл 05, 00:32    [1722396]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
мимо проходил
Guest
врубился однако...ишь ты... как оно бывает оказываться

кстати попробуй create function DBO.fn_GlobalID()
вместо create function fn_GlobalID()

кажись в этом твоя заморочка
21 июл 05, 00:39    [1722398]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
мимо проходил
врубился однако...ишь ты... как оно бывает оказываться

кстати попробуй create function DBO.fn_GlobalID()
вместо create function fn_GlobalID()

кажись в этом твоя заморочка


Менял - не помогает.
Ошибка таже.
:-(
21 июл 05, 01:08    [1722412]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10753
Блог
Ничего удивительного, что приведённый пример не работает на Юконе. Я не буду тут обсуждать ущербность самой идеи, но стоит почитать про новые особенности организации системы прав доступа, особенно к системным объектам. Не советую Вам создавать объекты в master, особенно на Юконе. Лучше создайте для этого пользовательскую базу данных, как это обычно рекомендуется.
21 июл 05, 11:47    [1723290]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
автор
Ничего удивительного, что приведённый пример не работает на Юконе. Я не буду тут обсуждать ущербность самой идеи, но стоит почитать про новые особенности организации системы прав доступа, особенно к системным объектам.

Скажем так, сервер не находит вполне несистемную функцию, которая лежит во вполне несистемной базе.
21 июл 05, 11:53    [1723327]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Пример не работает, даже если функция будет возвращать единицу.
imho, как минимум, неудобно.
21 июл 05, 12:16    [1723446]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Даутов
Member

Откуда: Казань
Сообщений: 502
На самом деле, это видимо ошибка реализации OpenQuery -
не отрабатывает модификация данных в команде UPDATE (возможно не работают и INSERT,DELETE).
Проверял на апрельском CTP (для июньского не знаю).
Вот простой скрипт для воспроизведения :


use master
GO
exec sp_addlinkedserver @server = N'loopback',
    @srvproduct = N'',
    @provider = N'SQLOLEDB', 
    @datasrc = @@servername
go
create database test
GO
use test
GO
create table taTest (a1 int)
GO
insert taTest values(0)
GO
select * from openquery(loopback, '
  set nocount on 
  set implicit_transactions off
  declare @a1 int 
  update test..taTest set @a1 = a1 = a1+1 
  select @a1
')
select * from test..taTest
21 июл 05, 12:17    [1723451]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Да ни при чем тут не openquery ни системные базы.
Вот скрипт попроще.
use AdventureWorks
go
if exists(select * from sysobjects where id = object_id('dbo.tbl_test_def'))
	drop table dbo.tbl_test_def
go
if exists(select * from sysobjects where id = object_id('dbo.fn_test_def'))
	drop function dbo.fn_test_def
go
create function dbo.fn_test_def()
returns bigint
as begin
	return 1
end
go
create table dbo.tbl_test_def
(
    id bigint primary key nonclustered constraint DF_t1_On_TestDB_2 DEFAULT dbo.fn_test_def(),
    name varchar(10)
)
go
use AdventureWorksDW
go
insert AdventureWorks.dbo.tbl_test_def(name) values ('ы')
----
Msg 208, Level 16, State 1, Line 1
Invalid object name 'dbo.fn_test_def'.
21 июл 05, 12:21    [1723476]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Это баг или фича?
21 июл 05, 12:23    [1723488]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Даутов
Member

Откуда: Казань
Сообщений: 502
Гавриленко Сергей Алексеевич
Да ни при чем тут не openquery ни системные базы.
Вот скрипт попроще.
use AdventureWorks
go
if exists(select * from sysobjects where id = object_id('dbo.tbl_test_def'))
	drop table dbo.tbl_test_def
go
if exists(select * from sysobjects where id = object_id('dbo.fn_test_def'))
	drop function dbo.fn_test_def
go
create function dbo.fn_test_def()
returns bigint
as begin
	return 1
end
go
create table dbo.tbl_test_def
(
    id bigint primary key nonclustered constraint DF_t1_On_TestDB_2 DEFAULT dbo.fn_test_def(),
    name varchar(10)
)
go
use AdventureWorksDW
go
insert AdventureWorks.dbo.tbl_test_def(name) values ('ы')
----
Msg 208, Level 16, State 1, Line 1
Invalid object name 'dbo.fn_test_def'.

Поведение сервера по сравнению с 2000 изменилось - значит, это ошибка.
В скрипте автора темы выявились 2 ошибки SQL Server 2005 :
- вызов UDF в DEFAULT-constraint в контексте текущей БД, а не в контексте БД модифицируемой таблицы
- невыполнение модификации данных в команде UPDATE при работе через OPENQUERY
21 июл 05, 13:27    [1723871]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Гавриленко Сергей Алексеевич
Это баг или фича?

Для решения этой проблемы есть синонимы:
use AdventureWorks
go
if object_id('dbo.tbl_test_def') is not null
drop table dbo.tbl_test_def
go
if object_id('dbo.fn_test_def') is not null
drop function dbo.fn_test_def
go
create function dbo.fn_test_def()
returns bigint
as begin
	return 1
end
go
create table dbo.tbl_test_def
(
    id bigint primary key nonclustered constraint DF_t1_On_TestDB_2 DEFAULT dbo.fn_test_def(),
    name varchar(10)
)
go
use AdventureWorksDW
go
if object_id('dbo.fn_test_def') is not null
drop synonym dbo.fn_test_def
go
create synonym dbo.fn_test_def
for AdventureWorks.dbo.fn_test_def
go
insert AdventureWorks.dbo.tbl_test_def(name) values ('ы')


Posted via ActualForum NNTP Server 1.2

21 июл 05, 16:12    [1724827]     Ответить | Цитировать Сообщить модератору
 Re: Владельцев sql 2005 прошу помочь.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Это, конечно, хорошо, но как быть при переходе с 2000-го? Да и потом, довольно неочевидно, что мне придется делать для всех юзерских функций в дефолтах таблиц в других базах в свой синонимы. Неудобно, если помягче так.
21 июл 05, 16:17    [1724848]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить