AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 55811
Accepted
IT researcher
IT researcher
Asked: 2013-12-31 05:29:21 +0800 CST2013-12-31 05:29:21 +0800 CST 2013-12-31 05:29:21 +0800 CST

O banco de dados com apenas db_datareader mostra propriedades inválidas para um índice

  • 772

Se um usuário do banco de dados do servidor SQL tiver publicpermissão apenas server rolespara um banco de dados específico db_datareadere publicpermissão, ao tentar script index as CREATE Toa opção no SSMS, o script gerado não estará correto.

Quero dizer, se um índice tiver uma condição filtrada, essa condição filtrada não será exibida

Portanto, para um usuário que tenha permissão de proprietário, script index as CREATE Toserá exibido

USE [test]
GO

/****** Object:  Index [filtered]    Script Date: 12/30/2013 18:54:19 ******/
CREATE NONCLUSTERED INDEX [filtered] ON [dbo].[Table_1] 
(
    [b] ASC
)
WHERE ([Table_1].[b] IS NULL)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

Para um usuário que só tem db_datareaderpermissão script index as CREATE Tomostrará

USE [test]
GO

/****** Object:  Index [filtered]    Script Date: 12/30/2013 18:55:13 ******/
CREATE NONCLUSTERED INDEX [filtered] ON [dbo].[Table_1] 
(
    [b] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

Tudo bem se um usuário db_datareadernão tiver permissão para ver o script de um índice e mostrar um erro de acesso negado. Mas mostra script inválido. Além disso, se as propriedades do índice estiverem marcadas, apenas a condição filtrada não será exibida e outras propriedades do índice serão exibidas. Por que isso acontece?

sql-server sql-server-2008-r2
  • 2 2 respostas
  • 1233 Views

2 respostas

  • Voted
  1. Best Answer
    Edward Dortland
    2013-12-31T07:54:54+08:002013-12-31T07:54:54+08:00

    É por design.

    Posso entender por que pode ser confuso poder ver metadados parciais. No entanto, a ideia por trás da função de dados db_datareader é conceder ao usuário acesso de leitura aos dados do usuário, bem como às informações da coluna. (você não seria capaz de criar uma instrução SELECT se também não tivesse acesso aos nomes das colunas.)

    Portanto, com isso em mente, mostrar apenas a parte da definição do índice que contém as informações da coluna estaria perfeitamente dentro dos limites da permissão do leitor de dados.

    A cláusula de índice filtrado, no entanto, é considerada informação não coluna, portanto, você precisa de mais permissão para poder ver esta parte da definição também.

    Você precisa da permissão VIEW DEFINITION naquele objeto, ou VIEW ANY DEFINITION para poder ver aquele bit extra de metadados.

    Eu acho que seria bom se eles dessem um aviso quando você gerasse um script CREATE "incompleto".

    Você mesmo pode testar:

    --create a database
    CREATE DATABASE [testdb]
    go
    
    --change context to new database
    USE [testdb]
    GO
    
    --create table
    CREATE TABLE [testtable] ( col1 int, col2 int)
    GO
    
    --create filtered index
    CREATE INDEX [fix_testtable_col1] ON [testtable](col1) WHERE col1 is not null
    GO
    
    --create a login
    CREATE LOGIN [testlogin] WITH   PASSWORD=N'test', 
                                    CHECK_EXPIRATION=OFF, 
                                    CHECK_POLICY=OFF
    
    --create a user in your database
    CREATE USER [testlogin] FOR LOGIN [testlogin]
    
    --add the user to the data reader role
    EXEC sp_addrolemember N'db_datareader', N'testlogin'
    
    
    --Change your execution contect to the new user with just datareader rights.
    EXECUTE AS LOGIN='testlogin'
    
    --try and view the filter definition of the index. It will not show the definition.
    SELECT  name,
            has_filter, 
            filter_definition 
    FROM sys.indexes
    WHERE name='fix_testtable_col1'
    
    --go back to being you
    REVERT
    
    --try and view the filter definition of the index. It will succeed.
    SELECT  name,
            has_filter, 
            filter_definition 
    FROM sys.indexes
    WHERE name='fix_testtable_col1'
    
    --give the user VIEW DEFINITION rights
    GRANT VIEW DEFINITION ON OBJECT::testTable to testlogin
    
    --switch context once again
    EXECUTE AS LOGIN='testlogin'
    
    --try and view the filter definition of the index. this time it will work.
    SELECT  name,
            has_filter, 
            filter_definition 
    FROM sys.indexes
    WHERE name='fix_testtable_col1'
    
    
    --don't forget to switch back to being you.
    REVERT
    
    • 7
  2. Tom Keller
    2021-09-15T14:46:27+08:002021-09-15T14:46:27+08:00

    É verdade que um db_datareader não pode confirmar diretamente o índice filtrado onde a cláusula (sys.indexes.filter_definition) e o SSMS não avisará um db_datareader que o script da definição do índice estará incompleto.

    No entanto, há uma solução alternativa que um db_datareader pode usar para confirmar indiretamente o filter_definition: especifique uma dica de índice em uma consulta, com uma cláusula where para testar a cobertura pelo índice filtrado.

    O MS-SQL lançará um erro se uma coluna ou valor especificado na cláusula where da consulta NÃO for coberto pela cláusula where do índice filtrado (sys.indexes.filter_definition).

    Dessa forma, você pode pelo menos verificar se a cláusula where da consulta que você gostaria de usar está coberta pelo índice filtrado. Você não precisa usar a dica de índice na produção, depois de verificá-la dessa maneira.

    Por exemplo, se um índice filtrado for criado por um db_owner como este:

    CREATE UNIQUE INDEX UQ_ZipData_PrimaryPerZip
     ON dbo.ZipData (ZIP) WHERE IsPrimaryCity = 1
    

    Então, como db_datareader, posso confirmar que esta consulta funciona, então confirmei que IsPrimaryCity = 1está coberta pelo índice:

    SELECT COUNT(*) AS Num
      FROM dbo.ZipData WITH (INDEX (NCI_ZipData_Zip))
      WHERE IsPrimaryCity = 1
    

    Também como db_datareader, posso confirmar que esta consulta falha, então confirmei que IsPrimaryCity = 0NÃO é coberto pelo índice:

    SELECT COUNT(*) AS Num
      FROM dbo.ZipData WITH (INDEX (NCI_ZipData_Zip))
      WHERE IsPrimaryCity = 0
    

    A mensagem de erro retornada pelo MS-SQL é:

    Msg 8622, Level 16, State 1, Line 1
    Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.
    
    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve