Se você obtiver a definição de algumas visualizações usando sys.sp_helptext
:
exec sys.sp_helptext 'sys.columns'
CREATE VIEW sys.columns
AS
SELECT c.id AS object_id,
c.NAME,
c.colid AS column_id,
c.xtype AS system_type_id,
c.utype AS user_type_id,
c.length AS max_length,
c.prec AS PRECISION,
c.scale,
CONVERT(SYSNAME, CollationPropertyFromId(c.collationid, 'name')) AS collation_name,
sysconv(bit, 1 - ( c.status & 1 )) AS is_nullable,-- CPM_NOTNULL
sysconv(bit, c.status & 2) AS is_ansi_padded,-- CPM_NOTRIM
sysconv(bit, c.status & 8) AS is_rowguidcol,-- CPM_ROWGUIDCOL
sysconv(bit, c.status & 4) AS is_identity,-- CPM_IDENTCOL
sysconv(bit, c.status & 16) AS is_computed,-- CPM_COMPUTED
sysconv(bit, c.status & 32) AS is_filestream,-- CPM_FILESTREAM
sysconv(bit, c.status & 0x020000) AS is_replicated,-- CPM_REPLICAT
sysconv(bit, c.status & 0x040000) AS is_non_sql_subscribed,-- CPM_NONSQSSUB
sysconv(bit, c.status & 0x080000) AS is_merge_published,-- CPM_MERGEREPL
sysconv(bit, c.status & 0x100000) AS is_dts_replicated,-- CPM_REPLDTS
sysconv(bit, c.status & 2048) AS is_xml_document,-- CPM_XML_DOC
c.xmlns AS xml_collection_id,
c.dflt AS default_object_id,
c.chk AS rule_object_id,
sysconv(bit, c.status & 0x1000000) AS is_sparse,-- CPM_SPARSE
sysconv(bit, c.status & 0x2000000) AS is_column_set -- CPM_SPARSECOLUMNSET
FROM sys.syscolpars c
WHERE number = 0
AND has_access('CO', c.id) = 1
Existe uma função chamada sysconv
.
A função 'sysconv' é usada por essas exibições e você pode selecionar valores dessa exibição sem obter nenhuma mensagem de erro.
select * from sys.columns;
Mas se eu tentar algo parecido com:
select sysconv(bit, 375 & 8);
Eu recebo o erro:
sysconv não é um nome de função integrado reconhecido
Como Martin Smith apontou, essa função pode ser substituída por convert (bit, 375 & 8)
, mas eu me pergunto por que posso selecionar valores dessa visão e não posso usá-la em minhas consultas, mesmo quando o SSMS a reconhece como comando, alterando a cor do primeiro plano?
A visualização sys.columns é uma visualização do sistema. Essa exibição é fornecida a você pelo usuário sys no banco de dados mestre, que é um usuário do banco de dados sem login.
O usuário sys tem seu próprio esquema sys, que é usado para vincular todos os objetos sys.*.
As permissões para selecionar objetos sys.* são concedidas a você por meio da associação na função pública do SQL Server. A função pública do SQL Server tem permissões SELECT em todos os objetos de esquema sys.*.
É assim que você recebe permissão para
select * from sys.columns
.Se você não for membro da função de servidor público, não terá acesso a nenhum dos objetos sys.*.
usuário sys (script)
esquema sys (script)
função de servidor público (script)
Função de banco de dados público
Há também uma
public
função de banco de dados, que está de alguma forma vinculada à função de servidor. Se você consultar asys.database_principals
(exibição) no banco de dados mestre, verá que existe umpublic
principal com o mesmo id da função de servidorpublic
que é 0. Presumo que este seja o elo perdido, entre o database_role public e o server_role público.Editar: Adicionadas algumas informações sobre a função de banco de dados "público"
Citação de funções de servidor e banco de dados no SQL Server , seção: "A função pública"
Se você recuperar as permissões para a função de banco de dados
public
no banco de dados mestre, obterá a seguinte listagem:Consulta:
Resultados:
Voltando ao seu exemplo com a exibição sys.colums: Você recebeu permissões para SELECT na exibição, mas não tem permissões para executar a função sysconv diretamente, que é a definição de uma coluna no conjunto de resultados . Ele foi escondido de seus olhos curiosos.