Os presento esta procedure que, en función de los permisos de un usuario, se
modificaran los campos en los que el usuario tenga permiso y, se devolverá
un String con los nombres de campo que el usuario no tenga permiso...
Al principio creo que està bién pero no me convence el final de ir
comentando campo por campo de la tabla.
Por esto quería interntarlo hacer con la Stored Procedure de sistema
"SP_SPKEYS" que retorna los campos
que son PK y, de esta forma hacer un cursor solo con las Columnas que no son
PK para poder comprobar
si el usuario pueder hacer UPDATE o no...
haber como lo veis...
Gracias.
/*
Esta tabla indica los bits utilizados para los permisos de
objetos quese devuelven cuando sólo se especifica objectid.
Bit(dec) Bit(hex) Permiso de la instrucción
1 0x1 SELECT ALL
2 0x2 UPDATE ALL
4 0x4 REFERENCES ALL
8 0x8 INSERT
16 0x10 DELETE
32 0x20 EXECUTE (sólo procedimientos)
4096 0x1000 SELECT ANY (al menos una columna)
8192 0x2000 UPDATE ANY
16384 0x4000 REFERENCES ANY
Esta tabla muestra los bits utilizados para los permisos de
objeto en lo referente a columnas, devueltos cuando se
especifican objectid y también column.
Bit(dec) Bit(hex) Permiso de la instrucción
1 0x1 SELECT
2 0x2 UPDATE
4 0x4 REFERENCES
*/
CREATE PROCEDURE [dbo].[MNU_OPCIONS_M]
@permisos VARCHAR(512) OUTPUT,
@id_gestio INT,
@id_mnu INT,
@p_id_gestio INT,
@p_id_mnu INT,
@apareix_a_fitxa INT,
@apareix_a_mnu INT,
@win_frm_accio VARCHAR(256),
@web_frm_accio VARCHAR(256)
AS
DECLARE @TAULA VARCHAR(512)
DECLARE @SEL VARCHAR(500)
SET @TAULA = 'MNU_OPCIONS'
IF PERMISSIONS(OBJECT_ID(@TAULA)) & 0x2 = 0x2
BEGIN
UPDATE a
SET a.p_id_gestio = @p_id_gestio,
a.p_id_mnu = @p_id_mnu,
a.apareix_a_fitxa = @apareix_a_fitxa,
a.apareix_a_mnu = @apareix_a_mnu,
a.win_frm_accio = @win_frm_accio,
a.web_frm_accio = @web_frm_accio
FROM [dbo].[MNU_OPCIONS] AS a
WHERE a.id_gestio = @id_gestio
AND a.id_mnu = @id_mnu
SET @permisos = ''
RETURN
END
ELSE
IF PERMISSIONS(OBJECT_ID(@TAULA)) & 0x2000 = 0x2000
BEGIN
SET @SEL = 'UPDATE a SET '
SET @permisos = ''
IF PERMISSIONS(OBJECT_ID(@TAULA),'p_id_gestio') & 0x2 = 0x2
SET @SEL = @SEL + 'a.p_id_gestio = ' + CAST(@p_id_gestio AS VARCHAR) +
', '
ELSE
SET @permisos = @permisos + 'p_id_gestio,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'p_id_mnu') & 0x2 = 0x2
SET @SEL = @SEL + 'a.p_id_mnu = ' + CAST(@p_id_mnu AS VARCHAR) + ', '
ELSE
SET @permisos = @permisos + 'p_id_mnu,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'apareix_a_fitxa') & 0x2 = 0x2
SET @SEL = @SEL + 'a.apareix_a_fitxa = ' + CAST(@apareix_a_fitxa AS
VARCHAR)+ ', '
ELSE
SET @permisos = @permisos + 'apareix_a_fitxa,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'apareix_a_mnu') & 0x2 = 0x2
SET @SEL = @SEL + 'a.apareix_a_mnu = ' + CAST(@apareix_a_mnu AS
VARCHAR)+ ', '
ELSE
SET @permisos = @permisos + 'apareix_a_mnu,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'win_frm_accio') & 0x2 = 0x2
SET @SEL = @SEL + 'a.win_frm_accio = ''' + @win_frm_accio + ''', '
ELSE
SET @permisos = @permisos + 'win_frm_accio,'
IF PERMISSIONS(OBJECT_ID(@TAULA),'web_frm_accio') & 0x2 = 0x2
SET @SEL = @SEL + 'a.web_frm_accio = ''' + @web_frm_accio + ''', '
ELSE
SET @permisos = @permisos + 'web_frm_accio,'
IF @SEL = 'UPDATE a SET '
GOTO ACCES_A_RES
SET @SEL = LEFT(@SEL,LEN(@SEL)-1)
SET @permisos = LEFT(@permisos,LEN(@permisos)-1)
SET @SEL = @SEL + ' FROM [dbo].[' + @TAULA + '] AS a '
SET @SEL = @SEL + ' WHERE a.id_gestio = ' + CAST(@id_gestio AS VARCHAR)
SET @SEL = @SEL + ' AND a.id_mnu = ' + CAST(@id_mnu AS VARCHAR)
EXECUTE (@SEL)
RETURN
END
ELSE
GOTO ACCES_A_RES
ACCES_A_RES:
SET @permisos 'p_id_gestio,p_id_mnu,apareix_a_fitxa,apareix_a_mnu,win_frm_accio,web_frm_ac
cio'
RETURN
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Leer las respuestas