Форум: "Базы";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
ВнизПраво на IDENT_CURRENT Найти похожие ветки
← →
Ёжик (2007-04-27 18:25) [0]В теле хранимки есть следующая строчка
SET @CID = IDENT_CURRENT ("TABLE_NAME");
.
У юзера есть права только на выполнение хранимок. Так вот эта строчка юзеру возвращает null. Как быть?
← →
Val © (2007-04-27 18:27) [1]поискать какое бы право добавить?
← →
ANB © (2007-04-27 18:38) [2]
> Ёжик (27.04.07 18:25)
Хранимки выполняются с правами пользователя, ее создавшего (DBO).
Значит проблема не в правах.
← →
Jan1 (2007-04-27 19:02) [3]
> Хранимки выполняются с правами пользователя, ее создавшего
> (DBO).
не совсем так. BOL:
...
Permissions
EXECUTE permissions for a stored procedure default to the owner of the stored procedure, who can transfer them to other users. Permissions to use the statement(s) within the EXECUTE string are checked at the time EXECUTE is encountered, even if the EXECUTE statement is included within a stored procedure. When a stored procedure is run that executes a string, permissions are checked in the context of the user who executes the procedure, not in the context of the user who created the procedure. However, if a user owns two stored procedures in which the first procedure calls the second, then EXECUTE permission checking is not performed for the second stored procedure.
...
← →
Ёжик (2007-04-27 19:39) [4]
> Хранимки выполняются с правами пользователя, ее создавшего
> (DBO).
Под sa всё нормально отрабатывает.
← →
MOA © (2007-04-27 22:55) [5]2Ёжик (27.04.07 19:39) [4]
Вы её не EXECUTE выполняете ли? Если да - см. Jan1 (27.04.07 19:02) [3] - об этом выделенное и рассказывает.
← →
Ёжик (2007-04-28 19:15) [6]
CREATE PROCEDURE dbo.SETNAMES
@parent_ID int,
@Name varchar (50),
@Table tinyint,
@new bit OUTPUT,
@ID int OUTPUT,
@CID int OUTPUT
AS
BEGIN
DECLARE @N varchar (50)
DECLARE @I int
SELECT @I = C.ID, @N = C.Name FROM dbo.Catalog C WHERE C.Object_type = @Table
AND C.Name = @Name;
SET @new = "true";
BEGIN TRANSACTION;
IF (@N = @Name) AND ((@Table = 1) OR (@Table = 2)) BEGIN
SET @CID = @I;
SET @new = "false";
END
ELSE
BEGIN
INSERT INTO dbo.Catalog (Name, Object_type) VALUES ( @NAME, @Table);
IF @@ERROR <> 0 BEGIN
ROLLBACK;
RETURN (1);
END
SET @CID = IDENT_CURRENT ("Catalog");
END
INSERT INTO dbo.Tree (Catalog_ID, parent_ID) VALUES (@CID, @parent_ID);
IF @@ERROR <> 0 BEGIN
ROLLBACK;
RETURN (1);
END
SET @ID = IDENT_CURRENT ("Tree");
COMMIT;
END
В таком виде. К dbo.Tree и к dbo.Catalog у юзера прав никаких :(
← →
Ёжик (2007-04-28 19:24) [7]Примерно так выполняется.
CREATE PROCEDURE dbo.ADDFOLDER
@parent_ID int,
@Name varchar (50),
@ID int OUTPUT,
@CID int OUTPUT
AS
BEGIN
DECLARE @aID int, @new bit, @r_Code tinyint, @bID int
BEGIN TRANSACTION
EXEC @r_Code = SETNAMES @Parent_ID, @Name, 4, @new OUTPUT, @aID OUTPUT, @bID OUTPUT;
IF @r_Code =1 BEGIN
ROLLBACK;
RETURN (1);
END;
SET @ID = @aID;
SET @CID = @bID;
COMMIT;
END
← →
Ёжик (2007-04-29 20:44) [8]
> Вы её не EXECUTE выполняете ли? Если да - см. Jan1 (27.
> 04.07 19:02) [3] - об этом выделенное и рассказывает.
А что же делать?
← →
Ёжик (2007-05-03 23:39) [9]Со SCOPE_IDENTITY() тоже самое. Select надо разрешать? А таблицу юзер увидит?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.048 c