как изменить v$session.program
Вам хотелось когда-нибудь изменить значение поля program из v$session для уже работающей сессии? Мне нет, но я пару раз встречал таких желающих.
Сам я предполагаю, что эта задача неосуществима средствами pl/sql и вообще OCI-интерфейса.
Однако для "обезбашенных" любителей ковыряться непонятно где, в данной заметке предлагается-таки способ изменения v$session.program
Для начала, вероятно, надо почитать заметку на этом сайте под названием прямой доступ к SGA.
Когда станет понятно, о чем там идет речь, то далее можно самостоятельно проделать следующее (вариант для C extension module для python):
- заменить в методе attach константу SHM_RDONLY на 0, чтобы подсоединяться к куску shared memory с правами на запись.
- добавить в C extension модуль метод writes, который будет записывать строку по адресу в памяти (по аналогии с методом reads, читающем строку из памяти).
Затем можно запустить примерно такой python скрипт, который будет менять значение program для всех пользователей 'SCOTT' на 'some program':
#!/usr/bin/env python import readSGA # you have to calculate these values by yourself shmid = 1 sgaBase = 0x50000000 ksuseAddr = 0x5F8A004C rowSize = 4584 rowCount = 170 rc = readSGA.attach(shmid,sgaBase) if (rc == -1): sys.exit("can't attach to SGA with id %d" % shmid) memaddr = ksuseAddr for i in range(rowCount-1): ksspaflg = readSGA.read1(memaddr+1) ksuseflg = readSGA.read4(memaddr+3292) username = readSGA.reads(memaddr+71,30) # ksuudlna if (ksspaflg & 1 != 0) and (ksuseflg & 1 != 0): if username == 'SCOTT': readSGA.writes(memaddr+3620,'some program',48) # ksusepnm memaddr += rowSize
После выполнения этого скрипта можно будет удостовериться (select username, program from v$session where username='SCOTT';), что значение program стало именно таким, каким мы захотели.
Напоследок хочется, как всегда, заметить, что такого рода эксперименты стоит проделывать только на базах, которые вы готовы потерять в любой момент.