2017-10-01 4 views
-1

Lasst uns sagen, dass ich TableA haben, die 5 Spalten:SQL Server wählen Sie nur Spalten mit Berechtigungen

Col1 
Col2 
Col3 
Col4 
Col5 

und ich bin mit SQL Server über User1 verbunden. Diese User1 hat Berechtigungen wählen col1, col2, col3 nur

ich diese

select * 
from information_schema.COLUMN_PRIVILEGES 

und Schleife für alle Rück Spalten tun können, und meine Select-Anweisung zu bauen, aber ich habe mehr als 500 select-Anweisungen in meinem Projekt (BIG-HR-Management-System), also brauche ich einen anderen Weg mit weniger Code-Änderung.

Nun, wenn ich versuche,

Select * from TableA 

es einen Fehler zurück.

Also wie kann ich nur diese Spalten mit Berechtigungen auswählen, ohne alle meinen Code zu ändern?

Editiert: Ich möchte eine Methode SQL Ausnahme außer Kraft zu setzen, wenn eine Spalte ohne Erlaubnis der Auswahl nur null zurück und zeigen keine Ausnahme

Edited 2: - die select * war nur ein Beispiel, einfacher zu sein: wenn ich 2 SQL Server-Benutzer haben, die erste Genehmigung in col1 hat - col3 die zweite hat die Erlaubnis, col4-Col6 , was die beste Methode ist, Spalten mit Erlaubnis

+2

Korrigieren Sie Ihre Anwendung so, dass nur die benötigten Spalten abgerufen werden. Möglicherweise müssen Sie die Abfragen basierend darauf erstellen, auf welche Benutzer Zugriff haben. –

+2

Sie sollten immer nur die Spalten auswählen, die Sie benötigen, anstatt '*' zu verwenden, damit das Problem nicht angezeigt wird. –

+0

Dieses Projekt ist ungefähr 10 Jahre alt und ich brauche einen Monat, um alle Anfragen zu lösen. – mothana

Antwort

1

ich stark für jeden Benutzer auszuwählen stimmen Die Kommentare deuten darauf hin, dass unterschiedliche Abfragen für unterschiedliche Verhaltensweisen geschrieben werden, anstatt dies dynamisch für jede Verwendung zu tun r. Während ich den Wunsch verstehe, es dynamisch zu tun (und Sie können das natürlich), wird es wahrscheinlich die gleiche Anstrengung sein, oder mehr, alle bestehenden Abfragen dynamisch zu verändern.

Übrigens, Sie sagten Abfragen statt Prozeduren. Keine Ahnung, ob das tatsächlich das ist, was Sie tun, aber wenn Ihre App nur Ad-hoc-SQL erstellt, würde ich stattdessen die Verwendung von gespeicherten Prozeduren empfehlen. Wenn Sie bereits sind, ignorieren Sie diesen letzten Kommentar.

Das sagte, hier ist ein bisschen Code, der veranschaulicht, wie Sie dies dynamisch tun könnten. Ob Sie diesen Code in jede Ihrer Prozeduren schreiben oder eine Funktion erstellen, die eine Zeichenfolge zurückgibt (die Spalten repräsentiert, zu denen der Benutzer berechtigt ist) oder dieses Verhalten in eine separate gespeicherte Prozedur aufbaut, die von jedem proc aufgerufen wird, sollte hoffentlich darauf hinweisen Sie zu Ihrer Lösung.

Ich habe hier ein kleines Mock-Setup erstellt, das sollte vollständig re-runnable sein. Ich habe nur einen der vorhandenen Dienstkonten (NT Service \ SQLWriter) als einen willkürlichen Benutzer für illustrative Zwecke ausgewählt.

-- Assumes you have a dB called test 
use test 
go 

-- Set up test table 
if object_id('test.dbo.colpriv', 'U') is not null drop table test.dbo.colpriv 
create table dbo.colpriv 
(
    Col1 int, 
    Col2 int, 
    Col3 int 
) 
insert into dbo.colpriv values (1, 3, 5) 

grant select on dbo.colpriv (Col1, Col3) to [NT SERVICE\SQLWriter] 

go 

declare 
    @Principal varchar(100) = 'NT SERVICE\SQLWriter', -- Just picked one out of a hat from sys.server_principials 
    @Sql nvarchar(max), 
    @Columns nvarchar(max) 

select 
    @Columns = stuff((select ',' + quotename(column_name) 
         from test.INFORMATION_SCHEMA.COLUMN_PRIVILEGES 
         where table_name = 'colpriv' 
          and grantee = @Principal 
         order by column_name 
         for xml path('')), 1, 1, ''), 
    @Sql = ' 
     select ' + @Columns + ' 
     from dbo.colpriv' 

exec sp_executesql @Sql 
Verwandte Themen